【问题标题】:WinAPI: get typed characterWinAPI:获取键入的字符
【发布时间】:2014-04-01 12:05:00
【问题描述】:

我目前正在开发一个名为“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);
}

【问题讨论】:

  • 您似乎根本没有处理修饰键
  • 我该如何处理它们?请提供一个小例子
  • 你遇到了更大的问题。你有知识缺陷。让其他人为您编写代码不会帮助您学习。您缺少的是 Windows 如何处理输入、虚拟键等方面的坚实基础。在继续之前,您需要了解这一点。

标签: c++ windows winapi keylogger


【解决方案1】:

MapVirtualKey() 无法知道是否按下了修饰键。您可能想查看ToAscii()ToUnicode() 他们都将键盘状态作为输入。

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

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2016-06-23
    • 2013-06-17
    • 2011-11-11
    • 2015-03-16
    • 2016-05-27
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多