我想捕获 Windows 注销事件,以便可以进行一些清理。我的WindowProc
看起来像这样:
switch (uMsg){
case WM_ENDSESSION:
case WM_DESTROY:
PostQuitMessage(0);
return 0;
// other messages
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
和消息循环WinMain
看起来像这样:
for(;;){
bool bTerminate = false;
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if(msg.message == WM_QUIT){
bTerminate = true;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(bTerminate){
break;
}
// do other stuff
Sleep(10);
}
FILE * fout;
fopen_s(&fout, "C:\\success.txt", "w"); // simulating cleanup actions
fclose(fout);
ExitProcess(0);
预期的机制是WindowProc
does PostQuitMessage
,导致主消息循环接收WM_QUIT
,打破循环并将程序发送到清理。当我退出程序时(从而发送WM_DESTROY
)程序创建success.txt
,但是当程序运行并且我注销时(发送WM_ENDSESSION
), 它不是。
我看过WM_QUERYENDSESSION
也一样,但是MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/aa376890%28v=vs.85%29.aspx说“每个申请都应该返回TRUE
or FALSE
收到此消息后立即执行,并推迟任何清理操作,直到收到WM_ENDSESSION
信息。”
WM_ENDSESSION
处理实际上并不给您的应用程序退出消息循环的机会。您应该假设系统在发送后调用 TerminateProcessWM_ENDSESSION
信息。
因此,应用程序需要执行的任何清理工作都应该在从窗口过程返回之前完成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)