是否有可能从.NET中的全局键盘钩子中确定当前用户

我想创build一个键盘和鼠标挂钩,将作为一个Windows服务启动。 我想监视全天使用系统的各种用户的活动。 即哪些用户在什么时候活跃

是可以确定哪个用户将接收事件? (该服务将作为一个单独的用户运行,所以getCurrentUser不合适)

不,Environment.UserName不起作用 – 挂钩过程不在输入接收器的上下文中调用。

事实上,我认为这是不可能的 – 如果使用.NET,你肯定使用的_LL钩子是低级钩子。 在我看来,在Windows甚至确定哪个桌面/应用程序将接收事件之前,它们被执行得很好。 我可能是错的 – 虽然我从来没有用过自己的钩。

@TcKs – 呃,快速用户切换怎么样?

其他方式:

WTSGetActiveConsoleSessionId函数允许您获取活动会话的ID。 具体:

WTSGetActiveConsoleSessionId函数检索当前连接到物理控制台的终端服务会话。 物理控制台是显示器,键盘和鼠标。 请注意,终端服务没有必要运行此功能才能成功。

然后,您可以使用WTSQueryUserToken来创建用户令牌,那么您应该能够使用该令牌获取有关用户的信息。

这个功能来自终端服务,但文档说:

请注意,终端服务没有必要运行此功能才能成功。

所以我认为,这是可以的。

我不知道这些挂钩 – 他们是否收到来自远程桌面键盘的事件? 如果他们只得到本地键盘,那么我认为你需要找到WinSta0的拥有者。