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 ...
随机推荐
- ODC(Orthogonal Defect Classification)简介——正交缺陷分类法
Defect分析是软件开发和测试中一个重要的环节,ODC介绍了一种不同于大家常用的非常有效的defect分类及分析方法.这篇文章简单的向大家介绍了什么是ODC,以及如何在项目和产品开发中使用ODC来改 ...
- BM算法模式匹配——字符串与KMP比较
下面是代码:BM是什么参考阮一峰老师的讲解 点击打开链接 #include<iostream> #include<algorithm> #include<string. ...
- netty codec部分剖析
针对netty 3.2进行剖析 今天用到了netty的encoder和decoder(coder其本质还是handler),特剖析一个netty提供的coder,从而选择或者实现我自己的coder. ...
- Opencv:10个步骤检测出图片中条形码
1. 原图像大小调整,提高运算效率 2. 转化为灰度图 3. 高斯平滑滤波 4.求得水平和垂直方向灰度图像的梯度差,使用Sobel算子 5.均值滤波,消除高频噪声 6.二值化 7.闭运算,填充条形码间 ...
- BZOJ_1224_[HNOI2002]彩票_爆搜+打表
BZOJ_1224_[HNOI2002]彩票_爆搜+打表 Description 某地发行一套彩票.彩票上写有1到M这M个自然数.彩民可以在这M个数中任意选取N个不同的数打圈.每个彩民只能买一张彩票, ...
- USACO 奶牛排队
题目:给出一个只含有1,2,3的数字序列,问最少交换多少次才能将之变为递增数列. 解: 注意到只有1,2,3,我们只要将1,3交换到自己的应在位置上那么排序就已经完成了. 需要交换的有几种,记$a(x ...
- poj3176【简单DP】
其实就是简单递推对吧~ 贴一发记忆化搜索的- #include <iostream> #include <stdio.h> #include <string.h> ...
- hdoj5003【wa水】
蜜汁wa,蜜汁wa,少了个\n------ #include<bits/stdc++.h> using namespace std; typedef long long LL; typed ...
- PMD - Avoid autogenerated methods to access private fields and methods of inner / outer classes
PMD错误 Avoid autogenerated methods to access private fields and methods of inner / outer classes 样例 p ...
- 通过 xshell 连接 ubuntu on windows(WSL)
装上 ubuntu on windows 后,默认要先打开 cmd, 再运行 bash 进入 ubuntu 的 shell. 但是这个shell很难看,配色不好就算了,还存在各种复制粘贴麻烦. 默认没 ...