gpt4 book ai didi

C++:响应 Windows 注销的清理操作

转载 作者:可可西里 更新时间:2023-11-01 09:25:31 27 4
gpt4 key购买 nike

我想捕捉 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);

预期的机制是WindowProcPostQuitMessage,导致主消息循环接收WM_QUIT,打破循环并将程序发送到清理。当我退出程序(因此发送 WM_DESTROY)时,程序会创建 success.txt,但是当程序运行时我注销(发送 WM_ENDSESSION >),事实并非如此。

我也查看了 WM_QUERYENDSESSION,但是 MSDN说“每个应用程序应在收到此消息后立即返回 TRUEFALSE,并推迟任何清理操作,直到它收到 WM_ENDSESSION 消息。”

最佳答案

WM_ENDSESSION 处理实际上并不给您的应用程序退出消息循环的机会。您应该假定系统在发送 WM_ENDSESSION 消息后调用 TerminateProcess。

因此,您的应用程序需要执行的任何清理都应该在从窗口过程返回之前完成。

关于C++:响应 Windows 注销的清理操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13003165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com