1

我在尝试挂​​接键盘时遇到问题(不是键盘记录器!)我正在尝试自动化 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;
 }

我已经尝试禁用防病毒软件,更改用户帐户控制,以管理员身份运行程序......没有任何效果。是什么导致了这种差异?

4

2 回答 2

1

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

在速度更快的机器上,它们可以足够快地处理钩子,并使其低于默认的 200 毫秒以处理超时。在速度较慢的机器上,他们的日子更难过。

对我来说,我必须将这个值从默认值提高到 500 毫秒(0x1F4),以便我的应用程序涉及挂钩,以便在机器之间保持可靠。

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

请参阅此处文档注释中的第四段:

LowLevelKeyboardProc 回调函数

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

HKEY_CURRENT_USER\控制面板\桌面

该值以毫秒为单位。如果钩子过程超时,系统将消息传递给下一个钩子。但是,在 Windows 7 及更高版本上,该挂钩会在不被调用的情况下被静默删除。应用程序无法知道挂钩是否被移除。

希望有帮助。

于 2012-10-24T18:35:16.763 回答
0

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

于 2016-11-06T11:56:15.607 回答