使用WM_KEYDOWN和wParam

时间:2013-10-13 16:00:58

标签: c++ input key

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

我可以让我的程序用

响应WM_KEYDOWN
if (WM_KEYDOWN)
    //do something

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

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

似乎不起作用。

这种代码远非我的深度,但人们说这是解决密钥重复延迟的最简单方法,所以请光临我。我真的不明白消息是什么或它如何有参数。

2 个答案:

答案 0 :(得分:0)

正如评论中指出的那样,你可能想写一下

if( message == WM_KEYDOWN )

因为

if( WM_KEYDOWN )

永远是真的,因为它是常数。

至于wparam检查我是否正确回忆你需要将它与小写字符比较而不是大写字符。

答案 1 :(得分:0)

这是一个非常古老的问题,因为 MSDN 有一些变化,但是我会尝试涵盖多个场景。

场景 A

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

场景 B

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

场景 C

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