1

我在实现全局键盘挂钩时遇到了一个有趣的问题。

我编写了一个用于设置挂钩的 dll,然后是一个加载 dll 并处理挂钩结果的应用程序(Delphi)。这是今天下午在我的电脑上完成的,经过一些测试,我认为它可以 100% 工作。

我刚刚在家中测试了相同的应用程序和 dll,我没有收到任何错误,但该应用程序似乎也没有收到任何数据。

两台机器都是WinXP,虽然我的工作机器是SP2,而这台机器是SP3。

Win32 API 中是否有一些更改会导致此故障,或者问题是否与最近发布的某些 A/V/Spyware/MS 更新有关?

我希望这里有人会在我花费数小时调试之前知道一个明显的原因,这可能会发生。

谢谢!

4

5 回答 5

2

实际上,有些 A/V 不喜欢自制挂钩。我在某些机器上的鼠标钩子也有同样的问题,而且它不依赖于服务包版本。

于 2009-02-03T16:46:51.343 回答
0

一种替代方法是使用低级键盘挂钩。(只是与 SetWindowsHookEx 不同的参数)。钩子在注册线程的消息循环中处理,因此不需要到处注入dll。由于某些奇怪的原因,VirusScanners/Firewalls 对它的干扰要小得多。他们经常默默地阻止 dllinjection 或正常的键盘钩子。如果您希望它在较旧的 Windows 版本中工作,也无需跨进程共享 hHook。如果您滥用键盘挂钩来实现全局热键(已经看到很多),请改用 RegisterHotkey/ http://msdn.microsoft.com/en-us/library/ms646309.aspx)。

于 2009-02-06T17:29:22.547 回答
0

您的家用计算机上有调试器吗?您是否通过钩子收到任何消息?可能是其他一些应用程序正在挂钩,并且没有将消息传递到挂钩链上吗?

顺便说一句:我喜欢用虚拟机进行这种测试。保持干净的 XP 安装。安装 SP2,并测试您的应用程序。回滚以再次全新安装,然后安装 SP3。再次尝试您的应用程序。这样你就会知道它是否是 SP3,因为没有其他东西可以搞砸了。我喜欢保留一组具有不同配置的快照。

于 2009-02-03T16:24:40.140 回答
0

是的,我可以。我还没有在这台机器上安装 Delphi,但我想我可能必须安装。我要在这里寻找低垂的果实。如果有一个明显的答案,就没有必要经历所有调试的麻烦并希望找到可能是什么问题。

我的第一个怀疑是某个地方的 API 发生了变化。

正如我所提到的,这个应用程序在我的工作机器上运行得非常完美。

于 2009-02-03T16:39:49.890 回答
0

你用的是哪种钩子?我曾经使用过WH_CBT-type 并且在某些其他应用程序运行时遇到了问题。我可以追溯到 Trillian 的一个案例,它似乎也做了某种挂钩(并且可能搞砸了)。

除此之外,我目前正在开发一个使用WH_KEYBOARD-hook 的应用程序,它同样适用于 SP2 和 SP3。MSDN 也没有提及任何与服务包相关的更改。

您可以采取哪些措施来跟踪家用机器上的错误:

  • 确保检查所有系统 api 调用的所有结果值(并GetLastError在出现错误时使用)
  • 在出现错误时提供某种调试输出(例如作为消息框或文本文件)
  • 可选:记录一些状态消息,以便您了解内部发生的情况
于 2009-02-04T09:13:51.507 回答