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

时间:2011-11-08 12:26:47

标签: c++ windows events logoff

我有一个来自我的同事的这个应用程序(用Visual C ++编写的Windows表单应用程序),我遇到了一些严重的问题。该应用程序既不是一个服务既不是一个正常的应用程序,我的意思是它有一个GUI,但大部分时间它在后台运行(它应作为一项服务作出反应,但事实并非如此)。此应用程序阻止用户注销,我需要能够这样做。

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

如果我尝试使用SessionEnding事件,应用程序只会被放到系统托盘中而不会注销,但我相信这是因为Form_Closing方法执行此操作而不是关闭程序(这是要求,我不能改变它)。

也许另一个有用的信息是应用程序自动启动,因为它在HKLM注册表中有一个条目,并且总是有2个这个应用程序运行的实例(一个应该监督另一个实例并在崩溃的情况下重新启动它)但不是“手动”关闭的情况。)

任何建议都会很受欢迎。

感谢。

3 个答案:

答案 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

进行正确的关机处理