本地进行编码时,发现似乎并没有具体提到如何在控制台上检测到关机/注销事件,特别是当控制台console处于system等权限时;
以上方法取自
https://stackoverflow.com/questions/6799955/how-to-detect-windows-shutdown-or-logoff
虽然是C#,但是方法是一致的,然后从
中确认该方法可用,并已本地验证过了;
当本地程序属于窗口类型,且处理
WM_ENDSESSION
消息失效时,可以使用该方法
建议使用如下代码,专门使用一个线程进行检测,然后也不会很浪费cpu资源,当然,肯定还有其他方法,不知道能不能找到
std::thread t([&,this]{
HANDLE h = CreateEvent(NULL, false, false, NULL);
bool init = false;
while (true)
{
if (!init)
{
LOG("get init shutdown");
init = true;
}
WaitForSingleObject(h, 10);
bool bShutDown = GetSystemMetrics(SM_SHUTTINGDOWN);
if (bShutDown)
{
LOG("get into shutdown");
this->DoShutDownEvent();
TerminateProcess(GetCurrentProcess(),0); //视情况是否自行结束进程
break;
}
}
});
t.detach();