zoukankan      html  css  js  c++  java
  • XP下关于快速切换用户功能的相关编程

    作者:林军

    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

  • 相关阅读:
    CSP-S 2019游记
    南校五天集训游记
    web.xml模板
    JDBC Template的基本使用
    Spring AOP(3)使用AspectJ xml配置
    Spring AOP(2)使用AspectJ注解
    Spring Aop(面向切面编程)
    Spring Bean管理3(xml与注解混合使用)
    Python核心技术与实战——十二|Python的比较与拷贝
    test
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/348660.html
Copyright © 2011-2022 走看看