繁体   English   中英

使用 WM_KEYDOWN 和 wParam

[英]Using WM_KEYDOWN and wParam

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

我可以让我的程序响应 WM_KEYDOWN

if (WM_KEYDOWN)
    //do something

但我不知道如何访问 wParam 参数。 代码

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

似乎不起作用。

这种代码超出了我的理解,但人们说这是解决关键重复延迟的最简单方法。 我真的不明白消息是什么或者它如何可以有一个参数。

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

if( message == WM_KEYDOWN )

因为

if( WM_KEYDOWN )

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

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

这是一个非常古老的问题,因为 MSDN 有一些变化,但是我将尝试涵盖多种情况。

情景A

您在不使用SetwindowsHookEx 的情况下通过 Windows 过程捕获消息回调。 示例:您正在WNDPROC 中捕获消息。 首先,您需要检测(msg == WM_KEYDOWN)的消息类型。 msg包含触发调用的事件。 通过这种方式,您可以使用wParam ,它将作为虚拟密钥代码。

情景B

您正在通过低级键盘程序 ( WH_KEYBOARD_LL ) 捕获消息回调。 在这个场景中, wParam充当Scenario A msg ,而lParam包含附加信息。 您需要将lParam映射到KBDLLHOOKSTRUCT并从中提取虚拟密钥代码。 KBDLLHOOKSTRUCT kbStruct = *((KBDLLHOOKSTRUCT*)lParam); 您现在可以使用kbStruct.vkCode访问虚拟密钥代码。

情景C

您正在通过键盘过程 ( WH_KEYBOARD ) 捕获消息回调。 在这种情况下, wParam包含您的虚拟密钥代码,lParam 包含标志。 有关标志的更多信息,请参阅 MSDN。 为了检测按键按下/按下和/或按住按钮,您必须依赖第 31 位和第 30 位( lParam>>31lParam&0x40000000 )上的标志。

暂无
暂无

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

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