【问题标题】:Delphi correct signature for LowLevelKeyboardProc()Delphi 正确签名 LowLevelKeyboardProc()
【发布时间】:2019-12-26 17:38:50
【问题描述】:

我正在 Delphi 2007 和 Windows 10 中编写一个全局键盘挂钩。我为 Delphi LowLevelKeyboardProc 回调找到了不同的签名。像这样的人和 Windows 文档 (https://docs.microsoft.com/es-es/previous-versions/windows/desktop/legacy/ms644985(v=vs.85))
LowLevelKeyboardProc() never is executed
提示 lparam 是指向 TKBDLLHOOKSTRUCT 记录的指针。
然而其他的(http://www.delphifaq.com/faq/delphi_windows_API/f512.shtmlhttps://www.swissdelphicenter.ch/en/showcode.php?id=1722),显示

function KeyHookFunc(Code, VirtualKey, KeyStroke: Integer): LRESULT; stdcall;  

完全忽略 TKBDLLHOOKSTRUCT 记录指针。
哪个是正确的?
我猜第一个是正确的,但我需要确定。我一直在使用这样的签名,但是当我在同一单元(和 DLL)中调用另一个 Function 并传递 lParam 时,它会在访问它时导致访问冲突。 DLL 中的所有函数和过程都使用 stdcall

【问题讨论】:

  • MS 链接正确。很难说为什么您的代码不起作用,因为我们无法从这里看到您的代码。 Delphi 定义可以在 Windows.pas 中找到:TFNHookProc = function (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;

标签: delphi hook keyboard-events


【解决方案1】:

所有的回调声明都是正确的,虽然后两个链接没有给出LowLevelKeyboardProc的例子而是KeyboardProc。 IOW,它们不是低级键盘钩子。

请注意,由于使用整数而不是 WPARAM、LPARAM 和 LRESULT,后两者不能在 64 位中工作。

【讨论】:

  • 这里有点困惑。 LowLevelKeyboardProc 和 KeyboardProc 有什么区别?我想访问冲突的发生是由于将LowLevelKeyboardProc 处理为KeyboardProc: hGlobalKeyHook := SetWindowsHookEx(**WH_KEYBOARD**,@LowLevelKeyboardProc,HInstance,0); 并且据我所知,他们收到了一组不同的参数。
  • 低级挂钩在生成时触发,高级挂钩在进程即将从其消息队列中检索输入事件消息时触发。因此,实现是不一样的。我相信文档会比我解释得更好。实际上,您不能为 KeyboardProc 传递低级回调过程的地址,那肯定会崩溃。
猜你喜欢
  • 2019-09-24
  • 1970-01-01
  • 2017-05-08
  • 2018-12-25
  • 2013-05-10
  • 2011-04-04
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多