我有一个来自我的同事的这个应用程序(用Visual C ++编写的Windows表单应用程序),我遇到了一些严重的问题。该应用程序既不是一个服务既不是一个正常的应用程序,我的意思是它有一个GUI,但大部分时间它在后台运行(它应作为一项服务作出反应,但事实并非如此)。此应用程序阻止用户注销,我需要能够这样做。
我知道当用户尝试注销时,Windows会向所有正在运行的应用程序发送WM_QUERYENDSESSION
消息。我试图在我的WndProc()
函数上捕获此消息并强行终止该应用程序,但它只能运行一次。当我再次登录并尝试注销时,操作未终止,因为我的应用程序不会关闭。
如果我尝试使用SessionEnding
事件,应用程序只会被放到系统托盘中而不会注销,但我相信这是因为Form_Closing
方法执行此操作而不是关闭程序(这是要求,我不能改变它)。
也许另一个有用的信息是应用程序自动启动,因为它在HKLM
注册表中有一个条目,并且总是有2个这个应用程序运行的实例(一个应该监督另一个实例并在崩溃的情况下重新启动它)但不是“手动”关闭的情况。)
任何建议都会很受欢迎。
感谢。
答案 0 :(得分:1)
SetConsoleCtrlHandler可以在用户注销和系统关闭时生成事件时提供解决方案。
答案 1 :(得分:1)
是的,此问题是由表单的FormClosing事件处理程序引起的。您要注意关闭原因,并且当用户关闭窗口时仅取消它。像这样:
System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) {
// Do this *only* when the user closes the window
if (e->CloseReason == CloseReason::UserClosing) {
e->Cancel = true;
this->Hide();
// etc...
}
}
答案 2 :(得分:0)
如果您可以控制源代码,请将第二个(控制器)实例重新实现为真正的Windows服务。如果它失败或需要关闭,请监视GUI实例并执行所需的控制操作。
这样您就可以免费获得当前手动执行的部分auto-restart logic,以及通过SERVICE_CONTROL_SHUTDOWN
进行正确的关机处理