为什么 Alt 键不会触发我的低级键盘挂钩?

xai*_*aid 3 delphi keyboard hook winapi

我正在试验键盘钩子,似乎Alt键(以及其他命令键)没有被钩住,我不知道为什么?

下面是带有一些调试代码的键盘钩子,它打印出 vkCode、scanCode 和 lpChar 读数。

它的工作原理,基本上全键,但不AltCtrl

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;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

要检测ALT按键按下,您需要响应WM_SYSKEYDOWN

另请注意,您忽略了 的值nCode。你必须非常仔细地阅读文档并按照它说的去做。

钩子过程用来确定如何处理消息的代码。如果 nCode 小于零,则钩子过程必须将消息传递给 CallNextHookEx 函数而无需进一步处理,并应返回 CallNextHookEx 返回的值。

此参数可以是以下值之一。

HC_ACTION (0)。wParam 和 lParam 参数包含有关键盘消息的信息。