为所有用户捕获Windows用户会话切换事件?

时间:2015-02-17 13:13:56

标签: c#

我正在制作一个Windows桌面应用程序,每个计算机只运行一个实例。一旦它开始我需要在用户登录时随时收到通知,即使它是会话解锁? SystemEvents.SessionSwitch事件仅捕获启动应用程序的用户的会话切换,同时我需要为所有用户捕获事件。

1 个答案:

答案 0 :(得分:3)

我认为您必须使用在用户登录之前执行的Windows Service进入系统,以捕获所有事件。之后,通知您的应用程序有关更改。我使用以下方法。

  1. 使用ServiceBase.OnSessionChange事件处理程序捕获不同的事件。
  2. SessionIdSessionChangeDescription方法获取WTSQuerySessionInformation结构中wtsapi32的相关用户信息。
  3. 我在下面添加了此实现的基本部分。

    public class CustomService : ServiceBase
        protected override void OnSessionChange(SessionChangeDescription desc)
        {
            switch (desc.Reason)
            {
                case SessionChangeReason.SessionLogon:
                    var user = CustomService.UserInformation(desc.SessionId);
                    CustomService.DoWhatEverYouWant(user);
                break;
            }   
        }
    
        private static User UserInformation(int sessionId)
        {
            IntPtr buffer;
            int length;
    
            var user = new User();
    
            if (NativeMethods.WTSQuerySessionInformation(IntPtr.Zero, sessionId, NativeMethods.WTS_INFO_CLASS.WTSUserName, out buffer, out length) && length > 1)
            {
                user.Name = Marshal.PtrToStringAnsi(buffer);
    
                NativeMethods.WTSFreeMemory(buffer);
                if (NativeMethods.WTSQuerySessionInformation(IntPtr.Zero, sessionId, NativeMethods.WTS_INFO_CLASS.WTSDomainName, out buffer, out length) && length > 1)
                {
                    user.Domain = Marshal.PtrToStringAnsi(buffer);
                    NativeMethods.WTSFreeMemory(buffer);
                }
            }
    
            if (user.Name.Length == 0)
            {
                return null;
            }
    
            return user;
        }
    }