Delphi   发布时间:2022-04-10  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了键盘钩子用delphi寻找F12大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题可能已经得到解答,但我一直无法找到正确的答案.我正试图在表单中按下F12键时切换调试开关.我无法使用onkeydown事件,因为我必须为每个字段和表单设置一个单独的函数.所以我研究并发现了Set WindowsHookEx函数来设置键盘钩子.这个工作得很好,除了我得到两个指示F12键每次按下时都按下:
2014/05/21 14:16:43.334
Code: 0
Key: 123
KeyStroke: 5767169
KeyStroke to Hex: 00580001
2014/05/21 14:16:43.446
Code: 0
Key: 123
KeyStroke: -1067974655
KeyStroke to Hex: C0580001  Note: this should be the keystroke that reflects KEYDOWN

我看到Keystroke是一种检查keydown的可能方法(WM_KEYDOWN $0100).我的问题是如何为WM_KEYDOWN测试击键?

这是我的回调函数:

function KeyboardHookProc(Code: Integer; Key: Word; KeyStroke: Longint) : LongInt;
begin
  Result := 0;
  if Code = HC_NOREMOVE then exit;
  Result := CallNextHookEx(FkbHook,Code,Key,KeyStrokE);
  if Code < 0  then exit;

{
WM_KEYDOWN

}
  if (KeyStroke and WM_KEYDOWN) = 0 then { this is where I need to test but this doesn't work! }
  begin
  if Code = HC_ACTION then
  begin
    case Key of
      vk_F12: begin
          TKPMF.Memo1.Lines.Add(FormatdatetiR_316_11845@e('yyyy/mm/dd hh:nn:ss.zzz',now));
          TKPMF.Memo1.Lines.Add('Code: ' + IntToStr(CodE));
          TKPMF.Memo1.Lines.Add('Key: ' + IntToStr(Key));
          TKPMF.Memo1.Lines.Add('KeyStroke: ' + IntToStr(KeyStrokE));
          TKPMF.Memo1.Lines.Add('KeyStroke to Hex: ' + LongToHex(KeyStrokE));
      end;
    end; {CasE}

  end;
  end;

end;

解决方法

您不需要为每个单独控件的OnKeyDown事件分配不同的处理程序.您可以指定所有这些使用相同的单个处理程序.如果启用表单的KeyPreview属性,则根本不需要为任何控件分配处理程序,您可以单独使用Form的OnKeyDown事件.如果在打开多个表单时需要检测按键,则可以使用TApplication.onmessage或TApplicationEvents.Onmessage事件.无论哪种方式,您根本不需要通过SetWindowsHooKEx()使用键盘钩子.

你的钩子不工作的原因是因为WM_KEYDOWN是一个窗口消息,而不是一个Keystroke标志. Read the documentation.您显示的两条消息的击键区别仅在于位30(上一个键状态)和31(过渡状态).

大佬总结

以上是大佬教程为你收集整理的键盘钩子用delphi寻找F12全部内容,希望文章能够帮你解决键盘钩子用delphi寻找F12所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。