【问题标题】:Delphi Keyboard HookDelphi 键盘挂钩
【发布时间】:2009-02-03 16:16:50
【问题描述】:

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: delphi winapi api hook


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          你可以做些什么来追踪你家机器上的错误:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-18
              • 2023-03-13
              • 2015-09-22
              • 2010-09-27
              • 1970-01-01
              相关资源
              最近更新 更多