【发布时间】:2011-08-14 11:57:50
【问题描述】:
是否可以从 windows(xp 和 7) 服务编写全局键盘挂钩? (使用 SetWindowsHookEx 在系统服务中不起作用)
【问题讨论】:
标签: .net c++ winapi windows-7 windows-services
是否可以从 windows(xp 和 7) 服务编写全局键盘挂钩? (使用 SetWindowsHookEx 在系统服务中不起作用)
【问题讨论】:
标签: .net c++ winapi windows-7 windows-services
SetWindowsHookEx 的文档说:
或与调用线程在同一桌面上的所有线程。
所以你需要关联同一个桌面(即使不考虑终端服务也会有多个桌面:普通桌面、安全桌面(用于 UAC 和登录)和屏幕保护程序)。
由于服务不与交互式会话相关联(并且,从 Windows V6 开始,不能),您需要用户会话中的一个进程来执行挂钩,并与后端服务通信(例如,通过命名管道)。并且不要忘记在没有人登录和多个用户登录的情况下进行测试。
【讨论】:
总结理查德所说的话(并添加我自己的评论): 您不能从 Windows Vista 开始的 Windows 服务直接设置全局键盘挂钩。但是,使用 Windows 服务仍然是一个合乎逻辑的选择,因为您将拥有设置全局挂钩的所有必要权限。您可以将您的权限复制到您在每个登录用户的会话中创建的子进程,以使您的子进程能够在他们自己的桌面/会话中设置全局挂钩,即使用户没有足够的权限。
就个人而言,(假设您正在编写键盘记录器)而不是将所有记录的击键汇总到一个进程并将它们写入磁盘,让每个单独的进程根据其用户名写入单独的文件可能是有意义的。
【讨论】: