標籤:des style blog http io ar color os sp
目標: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
windows session logoff時進行處理動作