当用户启动注销/关机操作时停止应用程序

我有一个从我的同事这个​​应用程序(用Visual C ++编写的Windows窗体应用程序),我面临一些严重的问题。 该应用程序既不是一个服务既不是一个正常的应用程序,我的意思是它有一个graphics用户界面,但大部分时间它在后台运行(它应该作为服务反应,但事实并非如此)。 此应用程序正在阻止用户注销,我需要能够做到这一点。

我知道当用户尝试注销时,Windows将WM_QUERYENDSESSION消息发送到所有正在运行的应用程序。 我试图在我的WndProc()函数上捕获此消息,并通过强制WndProc()该应用程序,但只能使用一次。 当我再次login并尝试注销时,操作未终止,因为我的应用程序不会closures。

如果我尝试使用SessionEnding事件,应用程序只放到系统托盘,并保持在那里没有注销,但我相信这是因为Form_Closing方法执行此操作,而不是closures程序(这是要求,我不能改变这一点)。

也许另一个有用的信息是应用程序自动启动,因为它在HKLMregistry中有一个条目,并且总是有两个应用程序正在运行(一个应该监督另一个,并在崩溃的情况下重新启动它,而不是在“手动“ 关掉)。

任何build议都会受到好评。

谢谢。

是的,这个问题是由窗体的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... } } 

SetConsoleCtrlHandler可以提供解决方案,因为在用户注销和系统关闭时会生成事件。

如果您拥有源代码的控制权,请将第二个(控制器)实例重新实现为真正的Windows服务。 让此监视器GUI实例,并执行所需的控制措施,如果它失败或需要关机。

这使您可以免费获得一些自动重新启动逻辑 ,您必须手动执行这些逻辑 ,并允许通过SERVICE_CONTROL_SHUTDOWN进行正确的关闭处理