是否可以从 .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 的全局键盘挂钩中确定当前用户的主要内容,如果未能解决你的问题,请参考以下文章

如何在C#中制作全局键盘钩子

什么会导致 Windows 取消挂钩低级别(全局)键盘挂钩?

.NET 应用程序中未调用低级键盘挂钩

Windows 全局键盘挂钩 - Delphi

全局键盘挂钩

用于 C# 和 WPF 的高级全局键盘钩子,用于读取键盘楔形卡扫描仪