低级键盘挂钩适用于Windows 7 x64而非另一台

时间:2012-08-30 01:40:34

标签: hook

我试图挂钩键盘时遇到问题(不是键盘记录器!)我试图自动化Word,然后我用一个特殊的钩子调用dll。

我有一个台式机和一个笔记本(两个有相同的防病毒+ Windows 7 x64),唯一不同的是在笔记本电脑中安装了更新版本的Windows。问题:笔记本电脑的一切工作都很精细。但在桌面上发生奇怪的事情:挂钩已经安装并且如果以记事本为目标,效果很好,但是,当针对Word时,虽然安装了挂钩,但是对外部函数的调用受到了压制!

 LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
 {
   if (code<0) {
      return CallNextHookEx(HookHandle,code,wParam,lParam);
   }

   bool callNextHook = true;
   if (callFunction != NULL) {
          // ONLY WITH WORD AND ONLY IN THE DESKTOP callFunction SEENS TO BE NULL!!!
          // this is a pointer to a function in main application
      callFunction(code,wParam,lParam,&callNextHook);
   } else {
      ShowMessage("THE UNKNOW ERROR! THIS MESSAGE IS SHOWED, THEN HOOK IS INSTALLED");
   }

   //Call the next hook in the chain
   if (callNextHook) {
      return CallNextHookEx(HookHandle,code,wParam,lParam);
   }

   return 0;
 }

我已经尝试过禁用防病毒,更改用户帐户控制,以管理员身份运行程序......没有任何效果。造成这种差异的原因是什么?

2 个答案:

答案 0 :(得分:1)

它可能与注册表中的LowLevelHooksTimeout值有关。

在速度更快的机器上,他们可以足够快地处理挂钩并使其在默认的200毫秒内处理超时。在较慢的机器上,它们会有更难的时间。

对于我来说,我必须将此值从默认值提升到我的应用程序涉及挂钩的500毫秒(0x1F4),以便跨机器可靠。

要查看更改此注册表值的效果,您必须重新启动计算机。

见以下文件备注中的第四段:

LowLevelKeyboardProc callback function

  

钩子程序应该在比数据更短的时间内处理消息   在以下LowLevelHooksTimeout值中指定的条目   注册表项:

     

HKEY_CURRENT_USER \ Control Panel \ Desktop

     

价值在   毫秒。如果挂钩过程超时,系统将通过   消息到下一个钩子。但是,在Windows 7及更高版本中,钩子是   默默地删除而不被调用。没有办法了   应用程序知道是否删除了钩子。

希望有所帮助。

答案 1 :(得分:0)

似乎是rad studio xe2中的一个bug,用xe6编译hook dll解决了这个问题。有趣的是,有了这个bug和一些额外的代码,有可能只用一个dll挂钩32和64程序。这样,我继续使用用xe2编译的旧dll。