0

在我拥有的 WIX 设置中,升级应用程序时,我设置了关闭可能保留需要更新的文件的应用程序的要求:

<util:CloseApplication
    Id="CloseMyApp" 
    Target="[MyAppExe]"
    CloseMessage="yes"
    Description="!(loc.MyAppStillRunning)"
    RebootPrompt="no"
    ElevatedCloseMessage="no"
/>

另一方面,应用程序将通过“用户友好”对话框捕获关闭窗口,用户可以在该对话框中确认他或她想要关闭应用程序。

当安装程序运行 CloseApplication 时,它发现必须停止该应用程序,但它无法关闭我的应用程序。一种理论是对话框阻止应用程序关闭。

所以问题是:这可能是一个问题吗?如果是这样 - 当安装程序要求应用程序关闭时,我怎样才能有这个确认对话框并且仍然正常运行?我必须收听 Win32 消息(例如 WM_QUIT/WM_CLOSE)还是有一个 .NET API 可以用来正确响应这些事件?

更新:根据mailinglist, Cl​​oseApplication 将发送 WM_CLOSE 给应用程序。如果用户关闭应用程序与 WIX 发送的关闭消息相比,我仍然会遇到不同行为的问题。不确定如何识别应用程序关闭方式的不同来源。

4

2 回答 2

0

您的应用程序应该获得一个 WM_CLOSE,它应该在您的 .NET 应用程序中作为主窗体上的“关闭”事件出现。在处理该问题时,您可以使用 Win32 API GetLastActivePopup检查您打开的任何活动对话框,并根据需要关闭它们。

您可以通过打开任务管理器并在您的应用程序上执行“结束进程”来测试您的实现。这将首先尝试使用类似于 WiX 可能正在执行的方法进行温和关闭。

于 2010-06-11T13:50:33.237 回答
0

当 VM_CLOSE 被发送到我的 WPF 应用程序时,我得到了 Jim 提到的 Closing 事件。在那个结束事件中,我检查了 Window 类的 IsFocused 属性。当这返回 false 时,我在没有任何用户确认的情况下退出了应用程序。

于 2010-06-14T06:52:38.357 回答