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=;//窗口类无扩展
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时进行处理动作的更多相关文章
- 关于SQL Server 安装程序在运行 Windows Installer 文件时遇到错误
前几日安装sql server2008r2 的时候碰到这个问题: 出现以下错误: SQL Server 安装程序在运行 Windows Installer 文件时遇到错误. Windows Insta ...
- windows下cmd时复制dos中的内容 错误信息等
16:28 2015/11/23小发现 windows下cmd时复制dos中的内容,错误信息等:鼠标右键选择标记,然后ctrl c 即可.
- session过期时ajax请求刷新浏览器
ajax前置处理实现异步请求session过期时跳转登录页面 function checkLogin(json) { if (typeof(json) === 'string' && ...
- vs调试windows mobile程序时布署时间太长的解决办法
vs调试windows mobile程序时布署时间太长的解决办法 1.VS平台上,选工具-选项-项目和解决方案-MS BUILD项目生成输出详细信息中选择“诊断”,目的是在调试窗口中看出哪个过程编译的 ...
- 安装SQL Server 2012过程中出现“启用windows功能NetFx3时出错”(错误原因、详细分析及解决方法)以及在Windows Server2012上安装.NET Framework 3.5的详细分析及安装过程
问题:在服务器(操作系统为Windows server 2012)上安装SQL Server 2012的过程中,安装停留在下图所示的界面上,显示”正在启用操作系统功能NetFx3”随后出 ...
- Windows Server 2012启用Windows功能NetFx3时出错解决方法
作者:冰点阳光 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址:http://baohua.me/operating-system/windows-server-2012- ...
- MVC启动windows身份验证时初次访问特别慢
最近做了一个关于MVC的项目,刚开始往服务器上面部署时,没有开启windows身份验证,等开发基本收尾时候,将验证开启时,第一次打开的时候需要将近15s的访问时间,别说用户受不了,自己都受不了了. 对 ...
- Windows删除文件时找不到该项目
当在Windows删除文件时出现找不到该项目或者显示该文件不在磁盘中,可以尝试以下方法: 在要删除文件的同级目录下 新建一文本文档,将下列代码复制到文档中,将文档保存为后缀名为.bat的文档(名字随意 ...
- tomcat cluster session同步时保存map数据遇到的问题
Tomcat Cluster官网:https://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html(tomcat7.0) 场景: tomcat1 ...
随机推荐
- poj 1258 Agri-Net 解题报告
题目链接:http://poj.org/problem?id=1258 题目意思:给出 n 个 farm,每个farm 之间通过一定数量的fiber 相连,问使得所有farm 直接或间接连通的 最少 ...
- Android 获取View宽度
/***************************************************************************** * Android 获取View宽度 * ...
- SPOJ:Ada and Orange Tree (LCA+Bitset)
Ada the Ladybug lives near an orange tree. Instead of reading books, she investigates the oranges. T ...
- 【198】Synergy - 鼠标键盘共享软件
参考:Synergy X64 v1.7.4 官方最新版 参考:Synergy安装方法 功能介绍: 可以将配置局域网的电脑实现同一个鼠标键盘控制两台电脑,效果类似一台电脑使用双屏的效果,键盘会根据鼠标的 ...
- A - Two Substrings
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description You ar ...
- ccflow_005.请假流程-傻瓜表单-审核组件模式
ccflow_005.请假流程-傻瓜表单-审核组件模式 ' 用审核组件演示各个流程应用 首先设置节点,填写请假单的 表单方案.选择内置傻瓜表单.我们之前创建的表单就回来了. 可以点击下面的设计傻瓜表单 ...
- GCD = XOR(GCD XOR )
首先没看懂XOR(于是百度了一下):异或,英文为exclusive OR,或缩写成xor.同时还有一个OR,于是一起看了一眼: 大意: 输入一个整数n,在1~n内,有多少对整数(a,b)满足GCD(a ...
- cmd - 批量重命名文件
相信大家或多或少都遇到过类似的情况:从网上下载了好多图片(或者其他的文件),这些图片的名字往往都是些乱七八糟的字母数字的组合,我们想要一次性修改几十张上百张的图片的名字应该怎么办呢? 这里有两种方法, ...
- Centos6.8 搭建 Mysql 主从复制
实例环境: MySQL-Master:Centos-6.8:192.168.153.130 MySQL-Slave:Centos-6.8:192.168.153.131 1.两台服务器安装mysql ...
- 一个Nice的生活主题博客模板
https://www.bitcron.com/ https://api.bitcron.com/ https://chopstack.com/