Windows是否总是允许挂钩和/或日志记录?

时间:2014-12-09 06:29:58

标签: c++ windows hook record journal

我正在编写一个键盘记录器/鼠标跟踪器,用于开源输入热映射应用程序,与Razer最新的热映射软件基本相同,但适用于任何硬件/操作系统(使用Qt的惊人之处)跨平台SDK)。正如您想象的那样,这涉及当应用程序不是主要进程时拦截来自内核的键盘和鼠标消息。

对于Windows,我被GetAsyncKeyState所吸引,但是关于此函数的返回值from MSDN的注释如果"前景线程属于另一个进程并且桌面不允许则返回零钩子或期刊记录。"

无论如何都在前进,我写了一个获取键盘状态的方法(通过Qt的QTimer方法触发每个设定的时间间隔),它只是起作用:

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

当我在调试器中观察这个数组时,即使应用程序不是主进程,我也可以看到数组中的值随着我的类型而改变。所以,对于我的计算机,至少这个函数可以在主线程没有集中在我的应用程序上时监视关键状态。

我的问题是:在哪些情况下,Windows 允许挂钩或日志记录?换句话说,是否存在某些版本的Windows和/或用户可能拥有/不具有此方法可能失败的权限?我真的无法访问一堆不同的机器来测试它。

我的规格是Windows 7 Home Premium 64位,Intel i7 930(2.8 GHz,四核超线程),12 GB DDR3 1333 MHz内存,2x Nvidia 460(如果有任何帮助)。

最诚挚的问候,

  • Weikardzaena

编辑:

Hans Passant给我举例说明了这种类型的实现失败的情况:主要是Windows上包含User Interface Privilege Isolation(UIPI)的应用程序。基本上,如果应用程序对操作系统非常重要(如命令提示符),则此类消息拦截将不起作用。我甚至测试过它并且它是真的:当命令提示符是主线程时,我的应用程序停止更新键盘数组。

这和LoPiTaL所说的表明只有特定的应用程序才会允许这种类型的拦截发生。我主要将这个应用程序瞄准那些(像我一样)希望看到按键和鼠标点击游戏玩家的游戏玩家,所以也许我并不关心这个问题,但如果我想扩展这一般用途(包括那些经常使用CMD的人)然后看起来似乎没有办法拦截那些类型的高架应用程序的关键消息。

是真的,还是像SetWindowsHookEx这样的方法仍然可以拦截到UIPI应用程序的消息?我试图避免直接实现钩子,因为这可能被视为人类家用机器上的病毒,并且捕获和重新发出每个输入消息只会减慢一切,这在游戏中是非常重要的。

0 个答案:

没有答案