windows session logoff時進行處理動作

來源:互聯網
上載者:User

標籤: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時進行處理動作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.