【问题标题】:Stop application when user initiates a log off / shutdown operation当用户启动注销/关闭操作时停止应用程序
【发布时间】:2011-11-08 12:26:47
【问题描述】:

我的同事有这个应用程序(用 Visual C++ 编写的 Windows 窗体应用程序),但我遇到了一些严重的问题。该应用程序既不是服务也不是普通应用程序,我的意思是它有一个 GUI,但大多数时候它在后台运行(它应该作为服务做出反应,但事实并非如此)。此应用程序阻止用户注销,我需要能够这样做。

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

如果我尝试使用SessionEnding 事件,应用程序只会被放入系统托盘并保持在那里而不注销,但我相信这是因为Form_Closing 方法执行此操作而不是关闭程序(这是要求,我无法更改)。

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

任何建议都会受到欢迎。

谢谢。

【问题讨论】:

    标签: c++ windows events logoff


    【解决方案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】:

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

      【讨论】:

        【解决方案3】:

        如果您可以控制源代码,请将第二个(控制器)实例重新实现为真正的 Windows 服务。让此监控 GUI 实例并在它失败或需要关闭时执行所需的控制操作。

        这为您免费提供了一些您目前必须手动执行的auto-restart logic,并允许通过SERVICE_CONTROL_SHUTDOWN 进行正确的关机处理

        【讨论】:

          猜你喜欢
          • 2014-05-25
          • 2011-04-26
          • 1970-01-01
          • 2011-03-04
          • 1970-01-01
          • 1970-01-01
          • 2013-12-01
          • 1970-01-01
          • 2019-09-20
          相关资源
          最近更新 更多