目标: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=;//窗口类无扩展
wndclass.cbWndExtra=;//窗口实例无扩展
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窗体创建"),);
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[] = {};
swprintf(buf, , _T("error:%d"), GetLastError());
MessageBox(NULL, buf, _T("Info"), nCmdShow);
} //进入消息循环:当从应用程序消息队列中检取的消息是WM_QUIT时,则退出循环
/*消息循环*/
while (GetMessage(&msg,NULL,,))
{
TranslateMessage(&msg);//键盘消息转换
DispatchMessage(&msg);//发送消息给窗口函数
}
return msg.wParam;//返回推出值
} /*窗口函数*/
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lparam)//参数:句柄,消息,消息参数,消息参数
{
WCHAR textBuf[] = {};
/*根据消息值转相应的消息处理*/
switch (message)
{
case WM_QUERYENDSESSION:
// do our job
return TRUE; // return FALSE
case WM_ENDSESSION:
// do our job
return ;
case WM_WTSSESSION_CHANGE:
// do our job
return ;
case WM_PAINT://重绘窗口客户区消息处理
HDC hdc;//定义设备描述表句柄
PAINTSTRUCT ps;//定义绘图星系结构变量
hdc=BeginPaint(hwnd,&ps);//获取要重绘的窗口的设备描述表句柄 TextOut(hdc,,TEXT(""),strlen(""));//输出文本
EndPaint(hwnd,&ps);//结束要重绘的窗口
return ;
case WM_DESTROY://撤销窗口消息处理
PostQuitMessage();//产生退出程序消息WM_QUIT
return ;
case WM_LBUTTONDOWN://add by shufac 添加鼠标左键按下的消息响应
MessageBox(NULL,TEXT("hello world"),TEXT("问候"),);
return ;
}
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时进行处理动作的更多相关文章

  1. 关于SQL Server 安装程序在运行 Windows Installer 文件时遇到错误

    前几日安装sql server2008r2 的时候碰到这个问题: 出现以下错误: SQL Server 安装程序在运行 Windows Installer 文件时遇到错误. Windows Insta ...

  2. windows下cmd时复制dos中的内容 错误信息等

    16:28 2015/11/23小发现 windows下cmd时复制dos中的内容,错误信息等:鼠标右键选择标记,然后ctrl c 即可.

  3. session过期时ajax请求刷新浏览器

    ajax前置处理实现异步请求session过期时跳转登录页面 function checkLogin(json) { if (typeof(json) === 'string' && ...

  4. vs调试windows mobile程序时布署时间太长的解决办法

    vs调试windows mobile程序时布署时间太长的解决办法 1.VS平台上,选工具-选项-项目和解决方案-MS BUILD项目生成输出详细信息中选择“诊断”,目的是在调试窗口中看出哪个过程编译的 ...

  5. 安装SQL Server 2012过程中出现“启用windows功能NetFx3时出错”(错误原因、详细分析及解决方法)以及在Windows Server2012上安装.NET Framework 3.5的详细分析及安装过程

           问题:在服务器(操作系统为Windows server 2012)上安装SQL Server 2012的过程中,安装停留在下图所示的界面上,显示”正在启用操作系统功能NetFx3”随后出 ...

  6. Windows Server 2012启用Windows功能NetFx3时出错解决方法

    作者:冰点阳光 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址:http://baohua.me/operating-system/windows-server-2012- ...

  7. MVC启动windows身份验证时初次访问特别慢

    最近做了一个关于MVC的项目,刚开始往服务器上面部署时,没有开启windows身份验证,等开发基本收尾时候,将验证开启时,第一次打开的时候需要将近15s的访问时间,别说用户受不了,自己都受不了了. 对 ...

  8. Windows删除文件时找不到该项目

    当在Windows删除文件时出现找不到该项目或者显示该文件不在磁盘中,可以尝试以下方法: 在要删除文件的同级目录下 新建一文本文档,将下列代码复制到文档中,将文档保存为后缀名为.bat的文档(名字随意 ...

  9. tomcat cluster session同步时保存map数据遇到的问题

    Tomcat Cluster官网:https://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html(tomcat7.0) 场景: tomcat1 ...

随机推荐

  1. codeforces 447C. DZY Loves Sequences 解题报告(446A)

    题目链接:http://codeforces.com/problemset/problem/447/C 题目意思:给出 一个 包含 n 个数的序列你,从中需要找出这个序列的最长子串,满足在里面只修改其 ...

  2. codeforces 672B B. Different is Good(水题)

    题目链接: B. Different is Good time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  3. I.MX6 AW-NB177NF p2p support

    /***************************************************************************** * I.MX6 AW-NB177NF p2 ...

  4. [POI 2014] Couriers

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3524 [算法] 首先离线 , 将询问按右端点排序 如果我们知道[l , r]这个区间 ...

  5. 详细的Ajax使用

    1. ajax对xml的接收和处理 xml主要作用: 主要保存和传输数据 1. xml文档结构 dom操作xml getElementsByTagName(); //根据标签名获取元素 childNo ...

  6. ASP.NET Core:创建一个Core项目

    ylbtech-ASP.NET Core:创建一个Core项目 1.返回顶部 1. 2. 3. 4.         5. 2.返回顶部 1.新建Razor页面 2. 3. 4.Abc 4.1.Abc ...

  7. C - Woodcutters

    Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description Little ...

  8. centos7安装redis3.2.12

    1.准备安装包,放在/usr/local/src/ 2.解压安装包,解压到/usr/local/ tar zxf redis-3.2.12.tar.gz -C /usr/local/ 3.cd /us ...

  9. 一些好用的Linux命令组合

    1.删除0字节文件 代码如下: find -type f -size 0 -exec rm -rf {} \; 2.查看进程按内存从大到小排列 代码如下: ps -e -o "%C : %p ...

  10. js、匿名函数、闭包、回调函数

    234567891011121314151617181920212223242526272829303132333435 闭包 闭包:闭包是指有权访问另一个函数作用域中的变量的函数 函数嵌套一个函数, ...