我正在尝试使用Keyboard钩子,似乎 Alt 键(以及其他命令键中)没有被钩住,我无法弄清楚为什么?
下面是带有一些调试代码的Keyboard钩子,它打印出vkCode,scanCode和lpChar读数。
它基本上适用于所有键,但不适用于 Alt 和 Ctrl 等
function LowLevelKeybdHookProc(nCode, wParam, lParam : integer) : integer; stdcall;
// possible wParam values: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP
var info : ^KeybdLLHookStruct absolute lParam;
lpChar : word;
kState : TKeyboardState;
begin
result := CallNextHookEx(kHook, nCode, wParam, lParam);
with info^ do
case WParam of
WM_KEYDOWN : begin
GetKeyboardState(kState);
Form1.Memo1.Text:=Form1.Memo1.Text+'vkCode: '+inttostr(vkCode)+
' scanCode: '+inttostr(scanCode)+
' lpChar: '+inttostr(lpChar)+;
end;
end;
end;
答案 0 :(得分:3)
要检测到 ALT 键,您需要回复WM_SYSKEYDOWN
。
另请注意,您忽略了nCode
的值。您必须非常仔细地阅读文档并按照说明进行操作。
钩子过程用于确定如何处理消息的代码。如果nCode小于零,则钩子过程必须将消息传递给CallNextHookEx函数而不进行进一步处理,并且应该返回CallNextHookEx返回的值。
此参数可以是以下值之一。
HC_ACTION(0)。 wParam和lParam参数包含有关键盘消息的信息。
答案 1 :(得分:0)
要检测 Alt 键,您需要检查上下文代码(lParam
的第29位)标志
bAltPressed := (lParam and (1 shl 29)) = (1 shl 29);
正如documentation所说:
上下文代码
上下文代码指示ALT键是否已关闭 当生成击键消息时。如果是ALT键,则代码为1 如果它已经下降,它就会下降。