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

posted @ 2014-12-03 19:37  onemuji  阅读(1914)  评论(0编辑  收藏  举报