如何在Win32 LowLevelKeyboardProc中监控Shift组合按键输入?
解决ToUnicode无法正确转换Shift+数字组合键的问题
你的代码存在三个核心问题,导致Shift+1、Shift+4这类组合键无法输出!、$等正确符号:
ToUnicode的wFlags参数错误
你传入的2对应UNICODE_NO_LINGUISTIC_FEATURES标志,该标志会跳过语言相关的字符转换逻辑,其中就包括Shift与数字键组合生成符号的规则。应传入0启用完整的转换逻辑。字符缓冲区未初始化
每次调用ToUnicode前,charBuf未被清空,之前的残留数据会导致输出乱码或错误字符。需要在声明时直接初始化缓冲区为0。宽字符输出方式错误
charBuf是WCHAR类型的宽字符,但你使用printf("%s", charBuf)输出,%s对应窄字符(char*),会导致宽字符被错误解析。应改用wprintf配合%ls格式符输出宽字符。
修正后的代码
#include <Windows.h> #include <WinUser.h> #include <tlhelp32.h> #include <stdio.h> #include <string.h> #include <ctype.h> LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode >= 0 && wParam == WM_KEYDOWN) { PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam; BYTE buf[256]; GetKeyboardState(buf); WCHAR charBuf[5] = {0}; // 初始化缓冲区为0,避免残留数据干扰 // wFlags传入0,启用完整的字符转换逻辑 int keyResult = ToUnicode(p->vkCode, p->scanCode, buf, charBuf, sizeof(charBuf)/sizeof(WCHAR), 0); if (keyResult > 0) { // 仅在转换成功时输出 wprintf(L"[%ls]", charBuf); } } return CallNextHookEx(0, nCode, wParam, lParam); } int main() { HHOOK hook = SetWindowsHookExA(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, 0); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessageW(&msg); } UnhookWindowsHookEx(hook); return 0; }
额外细节说明
- 务必检查
ToUnicode的返回值:返回值>0表示成功转换对应数量的字符;返回值0表示未生成有效字符;返回值<0表示需要再次调用(处理死键等特殊情况)。 - 无需额外维护
isUppercase变量,GetKeyboardState会自动包含Shift、CapsLock等按键的状态,ToUnicode会据此自动处理大小写和符号转换。
内容的提问来源于stack exchange,提问作者sunflower
相关产品推荐
相关产品推荐

