Delphi键盘钩

时间:2009-02-03 16:16:51

标签: delphi winapi api hook

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

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

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

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

Win32 API是否有一些变化导致此故障,或者问题是否与最近发布的某些A / V /间谍软件/ MS更新有关?

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

谢谢!

5 个答案:

答案 0 :(得分:2)

实际上有些A / V不喜欢自制的挂钩。我的鼠标钩子在某些机器上遇到了同样的问题,并且它不依赖于Service Pack版本。

答案 1 :(得分:0)

您的家用电脑上是否有调试器?你是否通过钩子收到任何消息? 可能是其他应用程序正在挂钩,并且不在挂钩链路上传递消息?

BTW:我喜欢这种测试的虚拟机。保持干净的XP安装。安装SP2,并测试您的应用程序。再次回滚以清理安装,并安装SP3。再试一次你的申请。通过这种方式,您将知道它的SP3,因为没有别的东西可以搞砸了。我喜欢用不同的配置保留一组快照。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

你使用哪种钩子?我曾经使用WH_CBT - 类型,并在某些其他应用程序运行时遇到问题。有一个案例我可以追溯到Trillian,这似乎也是一种挂钩(也许是螺丝钉)。

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

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

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

答案 4 :(得分:0)

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