繁体   English   中英

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

[英]Why does the Alt key not trigger my low-level keyboard hook?

我正在尝试使用Keyboard钩子,似乎Alt键(以及其他命令键之间)没有被挂钩,我无法弄清楚为什么?

下面是带有一些调试代码的Keyboard钩子,它打印出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;

要检测ALT键是否关闭,您需要响应WM_SYSKEYDOWN

另请注意,您忽略了nCode的值。 您必须非常仔细地阅读文档并按照说明进行操作。

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

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

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

要检测Alt键,您需要检查上下文代码( lParam 29位)标志

bAltPressed := (lParam and (1 shl 29)) = (1 shl 29);

正如文件所说:

上下文代码

上下文代码指示在生成击键消息时ALT键是否关闭。 如果ALT键已关闭,则代码为1;如果ALT键已启动,则代码为0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM