是否可以从 .NET 的全局键盘挂钩中确定当前用户
Posted
技术标签:
【中文标题】是否可以从 .NET 的全局键盘挂钩中确定当前用户【英文标题】:Is it possible to determine the current user from within a global keyboard hook in .NET 【发布时间】:2010-09-12 06:44:59 【问题描述】:我想创建一个键盘和鼠标挂钩,它将作为 Windows 服务启动。我想监控全天使用系统的各种用户的活动。即哪些用户在什么时间活跃。
是否可以确定哪个用户将接收事件? (该服务将作为单独的用户运行,因此 getCurrentUser 不合适)
【问题讨论】:
哇,这个应用程序听起来“老大哥”险恶! 【参考方案1】:不,Environment.UserName 不起作用 - 挂钩过程不会在输入接收器的上下文中调用。
确实,我认为这是不可能的 - 如果使用 .NET,您无疑会使用 _LL 挂钩,它是低级挂钩。在我看来,它们在 Windows 甚至确定哪个桌面/应用程序将接收事件之前就已经执行了。不过,我可能错了 - 我自己从未使用过 _LL 挂钩。
【讨论】:
【参考方案2】:@TcKs - 嗯,快速用户切换怎么样?
【讨论】:
是的,我忘记了。也许(msdn.microsoft.com/en-us/library/…)可以提供帮助。【参考方案3】:我不知道这些挂钩 - 它们是否接收来自远程桌面键盘的事件?如果他们只得到本地键盘,那么我认为你需要找到 WinSta0 的所有者。
【讨论】:
【参考方案4】:另一种方式:
WTSGetActiveConsoleSessionId 函数允许您获取活动会话的 ID。具体:
WTSGetActiveConsoleSessionId 函数检索当前附加到物理控制台的终端服务会话。物理控制台是显示器、键盘和鼠标。请注意,此功能无需运行终端服务即可成功。
然后您可以使用WTSQueryUserToken 来获取用户的令牌,然后您应该能够通过令牌获取有关用户的信息。
此功能来自终端服务,但文档说:
请注意,此功能无需运行终端服务即可成功。
所以我认为,这可能是一种方式。
【讨论】:
以上是关于是否可以从 .NET 的全局键盘挂钩中确定当前用户的主要内容,如果未能解决你的问题,请参考以下文章