• 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

  • 相关阅读:
    JavaBean和Map之间的转化
    java基础Map遍历
    sql server
    android之使用百度地图(1)
    Java基础知识2(字符串)
    Java基础知识1
    DAY12-Java中的类--接DAY10
    DAY11-LocalDate小练习
    DAY10-万物皆对象-2018-2-2
    DAY9-字符串笔记整理2018-1-19
  • 原文地址:https://www.cnblogs.com/bugchecker/p/4141050.html
Copyright © 2020-2023  润新知