中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 系统
XP下关于快速切换用户功能的相关编程
作者:未知 时间:2005-07-20 14:20 出处:VC知识库 责编:chinaitpower
              摘要:XP下关于快速切换用户功能的相关编程
XP下关于快速切换用户功能的相关编程
作者:林军


源代码1:源码

XP下关于快速切换用户功能的相关编程

       不知道大家注意到没有,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.

 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。

任何问题希望能与大家共同探讨!
林军
esmilepro@hotmail.com

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有