来自Windows服务的全局键盘钩子

时间:2011-04-28 07:55:48

标签: .net c++ winapi windows-7 windows-services

是否可以从Windows(xp和7)服务编写全局键盘挂钩? (使用SetWindowsHookEx无法从系统服务中运行)

2 个答案:

答案 0 :(得分:10)

SetWindowsHookEx的文档说:

  

或与调用线程在同一桌面中的所有线程。

因此,您需要与同一个桌面相关联(即使不考虑终端服务,也会有多个桌面:普通桌面,安全桌面(用于UAC和登录)和屏幕保护程序。)

由于服务不与交互式会话相关联(并且,从Windows V6,不能),您需要在用户会话中进行挂钩,并与后端服务进行通信(例如,通过命名管道) )。并且不要忘记在没有登录的情况下进行测试,并且多个用户已登录。

答案 1 :(得分:5)

总结理查德所说的内容(并添加我自己的评论):  您无法直接从Windows Vista开始的Windows服务设置全局键盘挂钩。但是,使用Windows服务仍然是一个合理的选择,因为您将拥有设置全局挂钩所需的所有权限。您可以将您的权限复制到您在每个登录用户的会话中创建的子进程,以使您的子进程能够在自己的桌面/会话中设置全局挂钩,即使用户没有足够的权限也是如此。

就个人而言,(假设你正在编写一个键盘记录器)而不是将所有记录的键击聚合到一个进程并将它们写入磁盘,让每个进程根据用户名编写单独的文件可能是有意义的。 p>