【发布时间】:2014-05-21 21:28:00
【问题描述】:
这个问题可能已经得到解答,但我一直无法找到正确的答案。当在表单中按下 F12 键时,我正在尝试切换调试开关。我无法使用 onkeydown 事件,因为我必须为每个字段以及表单设置一个单独的函数。所以我研究并发现了 SetWindowsHookEx 函数来设置键盘钩子。这工作得很好,除了每次按下 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(FormatDatetime('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;
【问题讨论】:
-
您使用的是什么版本的Delphi?为什么不使用表单的 KeyPreview? stackoverflow.com/questions/6509242/…
-
在最坏的情况下使用 ApplicationEvents。无需挂钩您自己的应用程序。
-
不知道为什么有人会在这里投反对票。 OP 展示了研究证据和示例代码。 OP 也是新的(rep=1),所以没有说明 Delphi 版本是情有可原的。
-
+1。没有理由在这里投反对票。提供了足够的信息和努力(包括代码),具体的 Delphi 版本无关紧要,因为
KeyPreview和OnKeyDown事件自 Delphi 1 以来就存在,并且仍然存在于 XE6 的 VCLTForm中。