在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,CloseApplication会将WM_CLOSE发送到应用程序。如果用户关闭应用程序而不是WIX发送的关闭消息,我仍然遇到不同行为的问题。不确定如何识别应用程序关闭的不同来源。
答案 0 :(得分:0)
您的应用程序应该获得一个WM_CLOSE,它应该在您的.NET应用程序中显示为主窗体上的“关闭”事件。在处理时,您可以使用Win32 API GetLastActivePopup检查您打开的任何活动对话框,并根据需要关闭它们。
您可以通过打开任务管理器并在应用程序上执行“结束进程”来测试您的实现。这将尝试使用类似于WiX可能正在进行的方法进行温和关闭。
答案 1 :(得分:0)
当VM_CLOSE发送到我的WPF应用程序时,我得到了Jim提到的Closing事件。在那个结束事件中,我检查了我的Window类上的IsFocused属性。当这返回false时,我退出应用程序而没有任何用户确认。