English 中文(简体)
Delphi键盘钩子
原标题:
  • 时间:2009-02-03 16:16:50
  •  标签:

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

我编写了一个用于设置钩子的dll,然后编写了一个应用程序(Delphi),该应用程序加载dll并处理钩子的结果。这是今天下午在我的工作电脑上完成的,在进行了一些测试后,我发现它的工作效果是100%的。

我刚在家里测试了同样的应用程序和dll,没有出现任何错误,但应用程序似乎也没有获取到任何数据。

两台机器都是WinXP,尽管我的工作机器是SP2,而这个是SP3。

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

我希望在我花费几个小时进行调试之前,这里有人能知道出现这种情况的明显原因。

谢谢!(Xiè xiè!)

问题回答

实际上,某些杀毒软件不喜欢自制的钩子。我的鼠标钩子在某些电脑上也有同样的问题,这并不取决于服务包版本。

是的,我可以。我没有在这台机器上安装Delphi,但我认为我可能需要。我正在寻找易于解决的问题。如果有明显的答案,就不需要费力去调试并希望找到问题所在。

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

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

Do you have a debugger on your home computer? Do you receive any messages via the hook at all? Can it be that some other application is hooking, and don t pass the message on down the hook-chain?

顺便说一句:我喜欢使用虚拟机进行此类测试。保持干净的XP安装。安装SP2,测试您的应用程序。然后重新安装干净的安装并安装SP3。再次尝试您的应用程序。这样您就知道它是否是SP3,因为没有其他东西会搞乱它。我喜欢保留一些不同配置的快照。

你正在使用哪种钩子?我曾经使用过WH_CBT类型的钩子,当运行特定的其他应用程序时遇到了问题。其中一种情况我能够追溯到 Trillian,它似乎也进行了某种钩子操作(可能会出问题)。

除此之外,我目前正在开发一个应用程序,它使用WH_KEYBOARD钩子,在SP2和SP3上同样效果良好。MSDN也没有涉及任何服务包相关的更改。

你可以采取哪些措施来追踪家用电脑上的错误:

  • make sure to check all result values of all system api calls (and use GetLastError in case of error)
  • provide some kind of debug output in case of error (e.g. as message box or to a text file)
  • optional: log some status messages so you know whats going on internally

One alternative is to use a low level keyboardhook. (Just a different param to SetWindowsHookEx). The hook is processed in the message loop of the registering thread, and thus does not need to inject a dll everywhere. And for some odd reason VirusScanners/Firewalls interfere much less with it. They often silently block dllinjection or normal keyboardhooks. Also removes the need to share the hHook across processes if you want it to work in older windows versions. And if you abuse a keyboardhook to implement global hotkeys(Have seen that a lot) use RegisterHotkey/http://msdn.microsoft.com/en-us/library/ms646309.aspx) instead.





相关问题
热门标签