"Intercept" Windows 关闭并执行命令

"Intercept" Windows shut down and execute a command

本文关键字:执行 命令 Intercept Windows      更新时间:2023-10-16

基本信息:

语言是c++(visual c++2013)。我的程序是一个win32应用程序,多线程(3个线程),就其设计而言,它作为关键进程运行(使用RtlSetProcessIsCritical,它完成了这项工作)。我可以通过编程打开和关闭它(两个函数,一个将当前进程设置为关键进程,另一个将目前进程设置为非关键进程)。

如果我只需单击start-->关闭windows,系统显然会因bsod而崩溃,如果手动终止一个关键进程,则会出现相同的bsod。

如何检测windows何时关闭/重新启动?这样我就可以执行"转向非关键"功能,从而彻底关闭。:)

其中一个线程由每5或10秒运行一次的循环组成,在这里添加windows关闭检测听起来是唯一可行的选择。

我只尝试了一件事,WM_ENDSESSION,如图所示http://msdn.microsoft.com/en-us/library/aa376889%28v=VS.85%29.aspx.但它"未能"检测到操作系统关闭,最终导致bsod。

我会发现一些例子或信息非常有用。如果需要其他详细信息,请告诉我,我将在几个小时内访问存储我的程序的计算机。非常感谢。

编辑:为什么投反对票?我在学习,想问一些我无法解决的问题。

edit:你能提供一个例子,说明在哪里/如何在我的循环中添加对消息的实际检查吗?我无法理解,我已经在switch语句中得到了WM_QUERYENDESSION的情况。。非常感谢。

---------------编辑:

我无法让它发挥作用,无论我做什么都无济于事。。我的伪代码程序:

thread 1
 { 
  functionx();
  functiony();
 }

thread 2
 {
  functionz();
  functionf();
 }

thread 3
 {
   for (;;)
    {
      functiong();
      functionh();
    }
 }
int main()
 {
   thread 1;
   thread 2;
   thread 3;
 }

对于GetMessage部分,我使用了此处的代码http://www.winprog.org/tutorial/window_click.html并重新调整以满足我的需求:

HWND hwnd;
MSG Msg;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_QUERYENDSESSION:
        function_to_turn_critical_process_OFF();
        return 0;
        break;
    case WM_ENDSESSION:
        function_to_turn_critical_process_OFF();
        return 0;
        break;
    }
    return 0;
}

消息循环:

while (GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}
return Msg.wParam;

好吧,如果我在main()中插入消息循环作为执行的第一件事,我会遇到问题1,GetMessage似乎会让整个事情进入睡眠状态,所以我的程序甚至不会开始做他的事情。

如果我在main()中插入消息循环作为最后一件执行的事情(在线程3下),我会遇到问题2,因为线程3永远不会结束(永远循环),消息循环可能永远不会开始。此外,线程3循环包含了几秒钟的小睡眠,我试图将get消息循环放在那里,但它没有抓住它,我无法删除原始代码,无法更改循环或删除小睡眠功能。

如果我在线程3循环中插入消息循环,它就无法检测到WM_QUERYENDESSION,并且我在关闭窗口时得到了一个BSOD,所以我的"关闭关键"功能没有被执行。

我能做什么?谷歌对这件事毫无帮助。我知道在一个简单的程序中,我应该把消息循环放在main中,它会一直工作到最后,但我在这里疯了,试图在我的代码中为这个消息循环找到一个位置。

任何帮助都将不胜感激。。

windows向应用程序发送两条消息:WM_QUERY_ENDSESSION和WM_ENDSESSSION

您可以对他们优雅地退出应用程序做出反应。

在您的情况下,WM_ENDSESSION可能发生得太晚,无法让您更改应用程序优先级。

在WM_QUERY_ENDSESSION中,系统尚未关闭。因此,您可以调整设置,然后返回"是的,当然!"。