WinAPI:获取类型字符

时间:2014-04-01 12:05:01

标签: c++ windows winapi keylogger

我目前正在开发一个名为" Key-O-Meter"的程序。该程序应跟踪Windows上用键盘输入的每个输入。跟踪的密钥将用于在其他时间创建统计信息。不幸的是,我在确定键入哪个字符方面遇到了问题。下面的代码只打印键盘上的字符(即" a"如果按下了#34;而不是" 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);
}

1 个答案:

答案 0 :(得分:2)

MapVirtualKey()无法知道是否按下了修改键。您可能希望查看ToAscii()ToUnicode()两者都将键盘状态作为输入。

可以使用GetKeyboardState()GetAsyncKeyState()

获取键盘状态