WinAPI:获取类型化字符

WinAPI: get typed character

本文关键字:字符 类型化 获取 WinAPI      更新时间:2023-10-16

我目前正在开发一个名为"Key-O-Meter"的程序。此程序应跟踪在Windows上使用键盘进行的每个输入。跟踪的键将用于在其他时间创建统计信息。不幸的是,我在确定键入了哪个字符时遇到了问题。下面的代码只打印键盘上的字符(即,如果按下 a,则打印"a",但如果按下 shift + "a",则不打印"A")。特殊字符根本不起作用。

有没有比MapVirtualKeyA更好的 WinAPI 函数来提供此功能?

#include <iostream>
#include <windows.h>
using namespace std;
LRESULT WINAPI lowLevelKeyboardProc(int nCode, WPARAM wParam,
        LPARAM lParam);
/**
 *
 */
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nCmdShow) {
    //add hook
    HHOOK hook;
    hook = SetWindowsHookEx(WH_KEYBOARD_LL,
            (HOOKPROC) lowLevelKeyboardProc, NULL, 0);
    //start message loop
    MSG message;
    while (GetMessage(&message, NULL, 0, 0) != 0) {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    //disable hook
    UnhookWindowsHookEx(hook);
    return 0;
}
/**
 *
 */
LRESULT WINAPI lowLevelKeyboardProc(int nCode, WPARAM wParam,
        LPARAM lParam) {
    if (wParam == WM_KEYDOWN) {
        //handle normal keydown
        PKBDLLHOOKSTRUCT hookStruct = (PKBDLLHOOKSTRUCT) lParam;
        char keyChar = MapVirtualKeyA(hookStruct->vkCode, MAPVK_VK_TO_CHAR);
        cout << keyChar << endl;
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
}

MapVirtualKey() 无法知道是否按下了修饰键。你可能想看看ToAscii()或ToUnicode()它们都接受键盘状态作为输入。

键盘状态可以使用 GetKeyboardState() 或 GetAsyncKeyState() 获取