C :响应Windows记录的清理操作
C++: cleanup actions in response to Windows logoff
我想捕获一个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
执行PostQuitMessage
,导致主要消息循环接收WM_QUIT
,打破循环并将程序发送到清理。当我退出程序(因此发送WM_DESTROY
)时,程序会创建success.txt
,但是当程序运行并登录(发送WM_ENDSESSION
)时,它不会。
我也看过WM_QUERYENDSESSION
,但是MSDN说:"收到此消息后,每个应用程序都应立即返回TRUE
或FALSE
,并将任何清理操作推迟到收到WM_ENDSESSION
消息。"
WM_ENDSESSION
处理实际上并没有使您的应用程序有机会退出消息循环。您应该在发送WM_ENDSESSION
消息后假设系统调用终止程序。
因此,您的申请需要进行的任何清理都应在从窗口过程中返回之前进行。
在Windows UI应用程序中,您可以使用: LRESULT CMainDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
您可以从此MSDN链接获得更多帮助。
{
if(message == WM_ENDSESSION)
{
if(lParam == ENDSESSION_LOGOFF)
{
/*Handle event*/
}
}
return CDialogEx::WindowProc(message, wParam, lParam);
}
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 将两个数组中的差异记录在第三个数组中
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 在SQLITE数据库中写入记录需要花费大量时间.如何提高刀片操作效率?
- 如何监控Android和iOS上的所有击键操作,如Windows键盘记录器
- C :响应Windows记录的清理操作
- 为什么Boost日志记录器操作不是常量
- 使用 DAO 在 C++ 中操作记录集中的 NULL 值