Windows将总是允许钩子和/或日志logging?

我正在写一个键盘logging器/鼠标跟踪器,用于与Razer最新的热映射软件基本相同的开源input热映射应用程序,但可用于任何硬件/操作系统(使用Qt的令人惊叹的跨平台SDK)。 就像你想象的那样,当应用程序不是主进程时,这涉及到从内核拦截键盘和鼠标消息。

对于Windows,我被绘制到GetAsyncKeyState,但是有一个关于MSDN返回值关于此函数返回零的说明,如果“前台线程属于另一个进程,并且桌面不允许挂钩或日记logging”。

不pipe怎么说,我写了一个获取键盘状态的方法(通过Qt的QTimer方法触发每个设定的时间间隔),它只是工作:

//The following executes every 100th of a second: for (int i = 0; i < 256; ++i) { keyboardArray[i] = GetAsyncKeyState(i); } 

当我在debugging器中观察这个数组的时候,即使应用程序不是主进程,我也可以看到数组中的值发生改变。 所以,对于我的电脑来说,至less这个函数在主线程没有关注我的应用程序时监视关键状态。

我的问题是:Windows在哪些情况下不允许挂钩或日志logging? 换句话说,是否有一些版本的Windows和/或特权的用户可以/没有这种方法可能会失败? 我真的不能访问一堆不同的机器来testing它。

我的规格是Windows 7家庭高级版64位,英特尔i7 930(2.8 GHz,四核心超线程),12 GB DDR3 1333 MHz内存,2个Nvidia 460,如果有任何帮助。

最好的祝福,

  • Weikardzaena

编辑:

Hans Passant给了我一个这种types的实现失败的例子:主要是Windows上的应用程序,包括用户界面特权隔离 (UIPI)。 基本上,如果应用程序对操作系统非常重要(如命令提示符),那么这种types的消息拦截将不起作用。 我甚至testing过它,这是真的:当一个命令提示符是主线程时,我的应用程序停止更新键盘arrays。

这和LoPiTaL所说的只有特定的应用程序不会允许这种types的拦截发生。 我主要是针对这个应用程序,他们(像我一样)希望看到按键和鼠标点击的游戏玩家,所以也许我不太在乎这个问题,但是如果我想扩大到一般的使用(包括大量使用CMD的人),那么似乎实际上没有办法拦截这些types的高级应用程序的关键信息。

这是真的,还是像SetWindowsHookEx方法仍然可以拦截邮件到UIPI应用程序? 我试图避免直接执行钩子,因为这可能被视为人们家用机器上的病毒,捕获和重新发送每一个input消息只会减慢所有的事情,这在游戏中是非常重要的。