【问题标题】:Winforms tray application and WM_CLOSEWinforms 托盘应用程序和 WM_CLOSE
【发布时间】:2014-04-22 22:16:14
【问题描述】:

如何编写一个 WinForms 应用程序,该应用程序除了托盘图标外没有任何可见元素,同时如果文件正在使用,则允许 Windows Installer 关闭该应用程序?据我了解,Windows 安装程序会向应用程序的主窗口发送 WM_CLOSE 消息。我假设“主窗口”由 ApplicationContext 的 MainForm 属性指示。在我看来,要使这种机制起作用,表单必须至少显示一次。

我发现了一些解决方法,例如创建一个空表单并将其不透明度设置为 0(以最大限度地减少闪烁)然后显示和隐藏,但将其描述为令人讨厌的 hack 会严重低估它的丑陋。

【问题讨论】:

  • 您是否真的尝试过使用 visible=false 的表单但它不起作用?您是否尝试调试以查看 FormClosing 事件是否被触发?
  • 您确实需要一个隐藏窗口,否则您将无法收到消息。事实上,如果您查看 NotifyIcon 类,如果您不提供,它会为您创建一个隐藏的 NativeWindow,尽管它不会在 WM_CLOSE 或 WM_ENDSESSION 时关闭应用程序。

标签: c# .net winforms windows-installer system-tray


【解决方案1】:

Windows Installer 不发送任何 WM_CLOSE 消息。这可能会有所帮助:

http://haishibai.blogspot.com/2010/02/complete-tutorial-patch-restart-your.html

这是一个稍微不同的场景,但如果您希望 Windows Installer 告诉您的应用何时应该关闭,它可能会帮助您入门。

在带有重新启动管理器的最新操作系统版本中,将检测到托盘应用。回到 Windows XP,它没有被检测到。

在 WiX 世界中,有一个 CloseApplication 实用程序自定义操作会将 WM_CLOSE 发送到应用程序窗口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多