windows 用户登录和注销监控|windows session 状态改变监控
2016-05-31 10:18
597 查看
不知道大家注意到没有,Windows XP新增加了一个快速切换用户的功能。它可以让您在不注销的情况下在用户之间进行切换,而且每个用户有自己独立的配置文件和桌面。也就是说当您切换到另外 一个用户(即用另外一个账号登陆)时,以前的那个用户运行的所有程序都还是在运行的,并没有退出来。这就给我们的开发带来了新的问题。比如您的应用程序提
供的功能在多个用户同时运行时发生错误,您必须为应用程序添加代码以检测该情形并作出相应的反应。
1、检测是否有用户正在运行该应用程序
我们平时都使用互斥体的方法来实现只有一个实例运行,而且在使用CreateMutex()生成互斥体是使用默认的方式,即互斥体的作用范围不是全局 的,只能在一个Session里起作用,而对于切换用户下存在多个Session是不起作用的,因而也就检测不到已经在运行的实例。解决的方法很简单,在 使用CreateMutex()时,在互斥体的名字前加上"Global"关键字即可。
m_hMutexAppRunning = CreateMutex(NULL, FALSE, "Global\\EsXPSwitchUserApp");
2、监测用户现在是否在切换用户有的时候,我们需要检测用户做切换用户操作的这个行为,以便让我们的程序能够做出相应的处理。
例如,我们需要在结束活动 用户会话运行状态时释放某些资源,而在其再次进入活动会话状态时重新获得该资源。还好Microsoft提供了让我们的程序接收会话通知消息的方法。我们 可以通过调用WTSRegisterSessionNotification 函数进行注册以接收WM_WTSSESSION_CHANGE
消息。
这些消息主要有:
WTS_CONSOLE_CONNECT
WTS_CONSOLE_DISCONNECT
WTS_REMOTE_CONNECT
WTS_REMOTE_DISCONNECT
WTS_SESSION_LOGON
WTS_SESSION_LOGOFF
WTS_SESSION_LOCK
WTS_SESSION_UNLOCK
在wParam中包含了这些消息类型,而lParam包含的是发生变化的Session的SessionID.
这样,我们就可以处理我们感兴趣的消息了,从而达到我们的目的.
3、注意事项
每一个对 WTSRegisterSessionNotification 的调用应与一个对 WTSUnRegisterSessionNotification 的调用匹配,
即在程序退出时要释放这个通知注册信息。
WTSRegisterSessionNotification 和 WTSUnRegisterSessionNotification 需要头文件Wtsapi32.h以及
Wtsapi32.lib。另外在包含 windows.h 的语句之前添加以下 #define 语句
#define _WIN32_WINNT 0x0501
文章附带的源代码在win2000pro下编译通过,程序只能在Window XP下运行,因为非XP系统没有WTSAPI32.dll。
供的功能在多个用户同时运行时发生错误,您必须为应用程序添加代码以检测该情形并作出相应的反应。
1、检测是否有用户正在运行该应用程序
我们平时都使用互斥体的方法来实现只有一个实例运行,而且在使用CreateMutex()生成互斥体是使用默认的方式,即互斥体的作用范围不是全局 的,只能在一个Session里起作用,而对于切换用户下存在多个Session是不起作用的,因而也就检测不到已经在运行的实例。解决的方法很简单,在 使用CreateMutex()时,在互斥体的名字前加上"Global"关键字即可。
m_hMutexAppRunning = CreateMutex(NULL, FALSE, "Global\\EsXPSwitchUserApp");
2、监测用户现在是否在切换用户有的时候,我们需要检测用户做切换用户操作的这个行为,以便让我们的程序能够做出相应的处理。
例如,我们需要在结束活动 用户会话运行状态时释放某些资源,而在其再次进入活动会话状态时重新获得该资源。还好Microsoft提供了让我们的程序接收会话通知消息的方法。我们 可以通过调用WTSRegisterSessionNotification 函数进行注册以接收WM_WTSSESSION_CHANGE
消息。
这些消息主要有:
WTS_CONSOLE_CONNECT
WTS_CONSOLE_DISCONNECT
WTS_REMOTE_CONNECT
WTS_REMOTE_DISCONNECT
WTS_SESSION_LOGON
WTS_SESSION_LOGOFF
WTS_SESSION_LOCK
WTS_SESSION_UNLOCK
在wParam中包含了这些消息类型,而lParam包含的是发生变化的Session的SessionID.
switch(message) { case WM_WTSSESSION_CHANGE: { switch(wParam) { case WTS_CONSOLE_CONNECT: MessageBox("WTS_CONSOLE_CONNECT", "Esmile", MB_OK ); break; case WTS_CONSOLE_DISCONNECT: MessageBox("WTS_CONSOLE_DISCONNECT", "Esmile", MB_OK ); break; case WTS_SESSION_LOCK: MessageBox("WTS_SESSION_LOCK", "Esmile", MB_OK ); break; case WTS_SESSION_UNLOCK: MessageBox("WTS_SESSION_UNLOCK", "Esmile", MB_OK ); break; case WTS_SESSION_LOGOFF: MessageBox("WTS_SESSION_LOGOFF", "Esmile", MB_OK ); break; case WTS_SESSION_LOGON: MessageBox("WTS_SESSION_LOGON", "Esmile", MB_OK ); break; default: break; } } break; default: break; }
这样,我们就可以处理我们感兴趣的消息了,从而达到我们的目的.
3、注意事项
每一个对 WTSRegisterSessionNotification 的调用应与一个对 WTSUnRegisterSessionNotification 的调用匹配,
即在程序退出时要释放这个通知注册信息。
WTSRegisterSessionNotification 和 WTSUnRegisterSessionNotification 需要头文件Wtsapi32.h以及
Wtsapi32.lib。另外在包含 windows.h 的语句之前添加以下 #define 语句
#define _WIN32_WINNT 0x0501
文章附带的源代码在win2000pro下编译通过,程序只能在Window XP下运行,因为非XP系统没有WTSAPI32.dll。
相关文章推荐
- tomcat端口配置文件解析
- 强悍的 Linux —— tar.xz 文件的解压
- CcentOS 安装VMware Tools 命令
- Linux 爱好者该向闭源软件敞开怀抱了
- Caused by: java.lang.NoClassDefFoundError: org/apache/commons/pool/BasePoolableObjectFactory
- Caused by: java.lang.NoClassDefFoundError: org/apache/commons/pool/BasePoolableObjectFactory
- 判断是手机还是电脑访问网站
- CentOS 6.5/6.3升级安装ImageMagick7.0.1
- Dubbo基础篇--在Linux操作系统上手工部署Dubbo服务
- Maven-Optional Dependencies & Dependency Exclusion
- CentOS7 安装与配置Pear
- 谈谈公司中研发体系的架构
- linux用户切换命令
- 【转】apache DateFormatUtils 与 DateUtils 的使用
- LINUX下配置JDK与TOMCAT
- 网站直达
- 记录一次chown误操作导致服务宕机修复过程(linux+nginx+php+mysql)
- 【linux】head&&tail
- Centos6.5下Jdk+Tomcat+Mysql环境安装图文教程
- 基于.NET平台的分层架构实战(六)——依赖注入机制及IoC的设计与实现[转]