getAsyncKeyState не распознает ввод ключа - PullRequest
0 голосов
/ 23 сентября 2011

Итак, я решил, что хочу написать небольшой кейлоггер сегодня вечером, просто чтобы узнать о getAsyncKeyState. Я пытаюсь заставить мой журнал записывать в файл, но содержимое файла либо отображается пустым, либо выбрасывает случайный адрес памяти (0x28fef0 раньше). Я слышал, что getAsyncKeyState плохо работает с Windows 7 x64, это правда?

Это довольно обидно, я надеялся, что смогу запустить это сегодня вечером.

    while(1)
    {
        Sleep(20);
        for(DWORD_PTR key = 8; key <= 190; key++)
        {
            if (GetAsyncKeyState(key) == HC_ACTION)
                checkKey(key);
        }
    }

Определение функции

void checkKey(DWORD_PTR key)
{
    ofstream out;
    out.open("log.txt");

        if (key==8)
            out << "[del]";
        if (key==13)
            out << "n";
        if (key==32)
            out << " ";
        if (key==VK_CAPITAL)
            out << "[CAPS]";
        if (key==VK_TAB)
            out << "[TAB]";
        if (key==VK_SHIFT)
            out << "[SHIFT]";
        if (key==VK_CONTROL)
            out << "[CTRL]";
        if (key==VK_PAUSE)
            out << "[PAUSE]";
        if (key==VK_ESCAPE)
            out << "[ESC]";
        if (key==VK_END)
            out << "[END]";
        if (key==VK_HOME)
            out << "[HOME]";
        if (key==VK_LEFT)
            out << "[LEFT]";
        if (key==VK_UP)
            out << "[UP]";
        if (key==VK_RIGHT)
            out << "[RIGHT]";
        if (key==VK_DOWN)
            out << "[DOWN]";
        if (key==VK_SNAPSHOT)
            out << "[PRINT]";
        if (key==VK_NUMLOCK)
            out << "[NUM LOCK]";
        if (key==190 || key==110)
            out << ".";
        if (key >=96 && key <= 105)
        {
            key -= 48;
            out << &key; // had ampersand
        }
        if (key >=48 && key <= 59)
            out << &key; // amp'd
        if (key !=VK_LBUTTON || key !=VK_RBUTTON)
        {
            if (key >=65 && key <=90)
            {
                if (GetKeyState(VK_CAPITAL))
                out << &key; // amp;d
            else
            {
                key = key +32;
                out << &key; // amp'd
            }
        }
        }
}

Я серьезно озадачен этой проблемой, и любая помощь будет принята с благодарностью. Почему такая функция работает в 64-битной системе иначе? Учитывая, что это единственное окно, которое у меня есть, я не могу запустить его на 32-битной системе, чтобы проверить, является ли это изолированной проблемой. Поскольку я предполагаю, что это связано с getAsyncKeyState, а не с моим кодом (который компилирует и создает пустой файл журнала), я включил только эти два фрагмента кода.

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Вы используете функцию неправильно.Чтение документации перед запросом помощи обычно является хорошей идеей ...

Я просто приведу здесь MSDN:

Если функция завершается успешно, возвращаемое значение указывает, был ли ключнажата с момента последнего вызова GetAsyncKeyState, и указана ли клавиша в данный момент вверх или вниз.Если установлен старший значащий бит, клавиша нажата, а если установлен младший значащий бит, клавиша была нажата после предыдущего вызова GetAsyncKeyState.Тем не менее, вы не должны полагаться на это последнее поведение;для получения дополнительной информации см. примечания.

Эта последняя часть также означает, что она совершенно бесполезна для регистратора ключей.

PS: рассмотрите возможность использования GetKeyNameText для перевода кодов виртуальных ключей в значимыеимена.

1 голос
/ 24 сентября 2011

Для мониторинга ввода, вероятно, следует использовать что-то вроде перехвата клавиатуры (посмотрите SetWindowsHookEx с WH_KEYBOARD_LL на MSDN).

Как уже отмечалось, вы не используете здесь GetAsyncKeyState правильно.

Что касается того, почему вы видите, что адрес появляется:

out << &key; // amp'd

Это несколько мест в вашем коде: ключ - это DWORD_PTR, поэтому & ключ - это указатель - скорее всего, туда, куда приходят адресас.

1 голос
/ 23 сентября 2011

Ну, во-первых, вы не хотите использовать GetAsyncKeyState, если пишете регистратор ключей; GetAsyncKeyState получает состояние ключа в тот момент, когда вы вызываете функцию. Вам необходимо прослушивать сообщения Windows для таких вещей, как WM_KEYDOWN, WM_KEYUP или в зависимости от назначения регистратора WM_CHAR, WM_UNICHAR и т. Д. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...