我有一个程序可以记录所有按键操作。目前,我正在使用 ToUnicode 将虚拟键代码转换为其各自的等效字符。
我遇到的唯一问题是这些字符没有显示正确的值,例如“!”或分别按下 Shift + 1 和 Shift + 4 时的“$”。
我当前的代码如下:
#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) {
static BOOL isUppercase = FALSE;
if (nCode >= 0 && wParam == WM_KEYDOWN) {
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
BYTE buf[256];
GetKeyboardState(buf);
WCHAR charBuf[5];
int key = ToUnicode(p->vkCode, p->scanCode, buf, charBuf, sizeof(charBuf), 2);
printf("[%s]", 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;
}
我知道我可以使用一些 switch 语句来检查虚拟键是否与 Shift 的虚拟键匹配,并在按下 Shift 后打印按键各自的值,但我想避免这种情况。
我哪里出错了?
ToUnicode
有这个功能。正如我在评论中所说,您需要将键盘状态 lpKeyState
设置为 ToUnicode
。
参考文献:https://stackoverflow.com/a/62783003,代码片段。
#include <Windows.h>
int main()
{
UINT code = 0x31;// 1 Key
{
//
// Map virtual key to scan code
//
UINT scanCode = 0;
scanCode = MapVirtualKey(code, 0);
//
// Keyboard state
//
BYTE abKbdState[256] = {};
if (!GetKeyboardState(abKbdState))
{
return 0;
}
abKbdState[VK_SHIFT] = 0x80;
//
// Map virtual key to character code
//
WCHAR wch[10] = {};
if (ToUnicode(code, scanCode, abKbdState, wch, 10, 0) == 1)
{
return 0;
}
}
return 0;
}