首页 > 代码库 > windows session logoff时进行处理动作

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

windows session logoff时进行处理动作