windows session logoff时进行处理动作
目标:Windows session logoff时得到通知,进行一些记录/清理工作
测试平台: win7 x64
logoff时系统会发送WM_ENDSESSION消息,如果某个应用对这个消息的处理返回0,那么logoff动作会暂停,系统停止给其他应用发送WM_QUERYENDSESSION消息。
如果返回TRUE,那么系统后续会给响应的应用发送WM_ENDSESSION消息。
我们可以在收到这两个消息时进行自己的处理。
下面代码里还有一个WTSRegisterSessionNotification(),本意是向系统注册session变化消息,并在WndProc-》WM_WTSSESSION_CHANGE里进行处理。
但测试发现logoff好像没有收到WM_WTSSESSION_CHANGE消息,这个问题待有时间再研究。
#include <windows.h> #include <Wtsapi32.h> #include <tchar.h> int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdline, int nCmdShow)//Windows程序的入口为WinMain函数 { HWND hwnd;//定义窗口句柄 MSG msg;//定义消息结构变量 WNDCLASS wndclass;//定义窗口类的结构变量 wndclass.style=CS_HREDRAW|CS_VREDRAW;//改变窗口大小这重绘 wndclass.lpfnWndProc=WndProc;//窗口函数为WndProc wndclass.cbClsExtra=0;//窗口类无扩展 wndclass.cbWndExtra=0;//窗口实例无扩展 wndclass.hInstance=hInstance;//注册窗口实例句柄 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//用箭头光标 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//背景为白色 wndclass.lpszMenuName=NULL;//窗口默认无菜单 //窗口类名为windows窗口创建 wndclass.lpszClassName=TEXT("windows窗体创建"); /*注册窗口类*/ if(!RegisterClass(&wndclass)) { MessageBox(NULL,TEXT("窗口注册失败!"),TEXT("windows窗体创建"),0); return false; } /*创建窗体*/ hwnd=CreateWindow(TEXT("windows窗体创建"),//窗口类名windows窗体创建 TEXT("windows窗体创建"),//窗口名windows窗体创建 WS_OVERLAPPEDWINDOW,//重叠式窗口 CW_USEDEFAULT,CW_USEDEFAULT,//左上角屏幕坐标默认值 CW_USEDEFAULT,CW_USEDEFAULT,//窗口大小默认值 NULL,//无父窗口 NULL,//无子窗体 hInstance,//创建值窗体实例句柄 NULL//值窗体无创建参数 ); /*显示并更新窗口*/ ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd);//更新窗口,包括窗口的客户区 BOOL bRtn = WTSRegisterSessionNotification(hwnd, NOTIFY_FOR_ALL_SESSIONS); if (bRtn == FALSE) { WCHAR buf[32] = {0}; swprintf(buf, 32, _T("error:%d"), GetLastError()); MessageBox(NULL, buf, _T("Info"), nCmdShow); } //进入消息循环:当从应用程序消息队列中检取的消息是WM_QUIT时,则退出循环 /*消息循环*/ while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg);//键盘消息转换 DispatchMessage(&msg);//发送消息给窗口函数 } return msg.wParam;//返回推出值 } /*窗口函数*/ LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lparam)//参数:句柄,消息,消息参数,消息参数 { WCHAR textBuf[32] = {0}; /*根据消息值转相应的消息处理*/ switch (message) { case WM_QUERYENDSESSION: // do our job return TRUE; // return FALSE case WM_ENDSESSION: // do our job return 0; case WM_WTSSESSION_CHANGE: // do our job return 0; case WM_PAINT://重绘窗口客户区消息处理 HDC hdc;//定义设备描述表句柄 PAINTSTRUCT ps;//定义绘图星系结构变量 hdc=BeginPaint(hwnd,&ps);//获取要重绘的窗口的设备描述表句柄 TextOut(hdc,10,TEXT("123"),strlen("123"));//输出文本 EndPaint(hwnd,&ps);//结束要重绘的窗口 return 0; case WM_DESTROY://撤销窗口消息处理 PostQuitMessage(0);//产生退出程序消息WM_QUIT return 0; case WM_LBUTTONDOWN://add by shufac 添加鼠标左键按下的消息响应 MessageBox(NULL,TEXT("hello world"),TEXT("问候"),0); return 0; } return DefWindowProc(hwnd,message,wParam,lparam);//其他消息交给有系统提供的缺省处理函数 }
参考:
http://msdn.microsoft.com/en-us/library/aa383828(v=vs.85).aspx
http://m.blog.csdn.net/blog/shufac/32731267
http://blog.csdn.net/gao_zilai/article/details/6997676