这个问题可能已经有了答案,但是我找不到适当的回应。 我正在尝试在表单中按下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
我看到按键输入是检测键盘按下的一种可能方法(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;
KeyPreview
和OnKeyDown
事件自Delphi 1以来就存在,并且仍然存在于XE6中的VCLTForm
中。 - Ken White