我正在制作一个Windows桌面应用程序,每个计算机只运行一个实例。一旦它开始我需要在用户登录时随时收到通知,即使它是会话解锁? SystemEvents.SessionSwitch事件仅捕获启动应用程序的用户的会话切换,同时我需要为所有用户捕获事件。
答案 0 :(得分:3)
我认为您必须使用在用户登录之前执行的Windows Service进入系统,以捕获所有事件。之后,通知您的应用程序有关更改。我使用以下方法。
SessionId
和SessionChangeDescription方法获取WTSQuerySessionInformation结构中wtsapi32
的相关用户信息。我在下面添加了此实现的基本部分。
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;
}
}