"Intercept" Windows 关闭并执行命令
"Intercept" Windows shut down and execute a command
基本信息:
语言是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中,系统尚未关闭。因此,您可以调整设置,然后返回"是的,当然!"。
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在 Minecraft 服务器上执行命令
- 如何在C++中执行命令并获取命令的返回代码标准输出和标准
- 如何查看完整的CMD执行命令,包括参数和标志?
- CPP 中 z3 的编译和执行命令?
- 线程保持运行并执行命令
- 在 MinGW 和 MinGW-64 上执行命令后变量为空?
- popen() 将执行命令的输出写入 cout
- 如何在 Heroku 中的 Python 服务器上执行 "g++" 命令?
- 以普通用户身份执行命令
- 如何在生成之前在 cmake 中执行命令?
- 如何使用 c++ 在 cmd 中使用管理员权限执行命令
- 如何在Unix Shell中的后台执行命令
- 如何从连接的控制台执行命令
- 尝试在路由器上执行命令。C++ & libssh
- 在服务器上执行命令,然后将结果发送到Windows中的客户端
- 通过C编程打开终端并执行命令
- 在远程服务器上执行命令行命令
- 在Linux上使用c++执行命令时被阻止
- 使用popen执行命令