Using WM_KEYDOWN and wParam
Using WM_KEYDOWN and wParam
这里的菜鸟问题,但我找不到任何其他线程来回答它。我想知道的只是如何使用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 A
的msg
,并且lParam
包含其他信息。您需要将lParam
映射到 KBDLLHOOKSTRUCT 并从中提取虚拟密钥代码。 KBDLLHOOKSTRUCT kbStruct = *((KBDLLHOOKSTRUCT*)lParam);
现在,您可以使用 kbStruct.vkCode
访问虚拟密钥代码。
方案 C
您正在通过键盘过程 (WH_KEYBOARD) 捕获消息回调。在此方案中,wParam
包含虚拟密钥代码,lParam 包含标志。有关标志的详细信息,请参阅 MSDN。为了检测按下/向上键和/或按住按钮,您必须依靠位 31 和 30(lParam>>31
和 lParam&0x40000000
)上的标志。
正如您可能打算写的评论中指出的那样
if( message == WM_KEYDOWN )
因为
if( WM_KEYDOWN )
将永远为真,因为它是一个常数。
至于 wparam 检查,如果我没记错的话,您需要将其与小写字符而不是大写字符进行比较。
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- python ctypes and C++ pointers
- wstring to LPARAM and WPARAM
- C++ wParam and Lparam confusion
- Using WM_KEYDOWN and wParam