Using WM_KEYDOWN and wParam

Using WM_KEYDOWN and wParam

本文关键字:and wParam KEYDOWN WM Using      更新时间:2023-10-16

这里的菜鸟问题,但我找不到任何其他线程来回答它。我想知道的只是如何使用WM_KEYDOWN消息,然后继续使用其 wParam 参数来检查按下了哪个键。像很多人一样,我正在使用它来尝试让窗口停止键重复延迟。

我可以让我的程序响应WM_KEYDOWN

if (WM_KEYDOWN)
    //do something

但是我无法弄清楚如何访问 wParam 参数。代码

if (WM_KEYDOWN)
    if (wParam == 'A')
        //do something

似乎不起作用。

这种代码超出了我的深度,但人们说这是绕过键重复延迟的最简单方法。我真的不明白消息是什么或它如何具有参数。

这是一个非常古老的问题,因为 MSDN 有一些更改,但是我将尝试涵盖多种方案。

方案 A

您正在通过 Windows 过程捕获消息回调,而无需使用 SetwindowsHookEx。示例:您正在 WNDPROC 中捕获消息。首先,您需要检测消息类型,如 (msg == WM_KEYDOWN) 所示。 msg包含触发调用的事件。这样,您就可以利用虚拟钥匙代码wParam

方案 B

您正在通过低级别键盘过程 (WH_KEYBOARD_LL) 捕获消息回调。在此方案中,wParam充当Scenario Amsg,并且lParam包含其他信息。您需要将lParam映射到 KBDLLHOOKSTRUCT 并从中提取虚拟密钥代码。 KBDLLHOOKSTRUCT kbStruct = *((KBDLLHOOKSTRUCT*)lParam);现在,您可以使用 kbStruct.vkCode 访问虚拟密钥代码。

方案 C

您正在通过键盘过程 (WH_KEYBOARD) 捕获消息回调。在此方案中,wParam包含虚拟密钥代码,lParam 包含标志。有关标志的详细信息,请参阅 MSDN。为了检测按下/向上键和/或按住按钮,您必须依靠位 31 和 30(lParam>>31lParam&0x40000000)上的标志。

正如您可能打算写的评论中指出的那样

if( message == WM_KEYDOWN )

因为

if( WM_KEYDOWN )

将永远为真,因为它是一个常数。

至于 wparam 检查,如果我没记错的话,您需要将其与小写字符而不是大写字符进行比较。