【问题标题】:Using WM_KEYDOWN and wParam使用 WM_KEYDOWN 和 wParam
【发布时间】:2013-10-21 05:58:33
【问题描述】:

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

我可以让我的程序响应 WM_KEYDOWN

if (WM_KEYDOWN)
    //do something

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

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

好像没用。

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

【问题讨论】:

  • if (WM_KEYDOWN) 中的条件始终为真。当然你的意思是if (msg == WM_KEYDOWN)。检查wParam你的方式对我来说看起来不错。究竟以何种方式,它似乎不起作用?你期望什么结果,你观察到什么结果?
  • 代码 sn-p 太差了,无法猜测“它不起作用”可能意味着什么。样板代码是if (HIWORD(lParam) & KF_REPEAT) // It's repeated
  • 嗯 wParam 总是带有红色下划线,显然是一个未声明的标识符。现在我再次尝试,WM_KEYDOWN 确实似乎总是正确的。

标签: c++ input key


【解决方案1】:

正如您可能打算编写的 cmets 中指出的那样

if( message == WM_KEYDOWN )

因为

if( WM_KEYDOWN )

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

至于 wparam 检查我是否记得正确,您需要将其与小写字符而不是大写字符进行比较。

【讨论】:

  • 我如何设置“消息”以根据是否按下某个键来返回?
  • if( message == WM_KEYDOWN ) 返回一个;否则返回 b;
【解决方案2】:

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

场景 A

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

场景 B

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

场景 C

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2016-10-20
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多