GetAsyncKeyState Требуется объяснение

Я хотел сделать небольшой кейлоггер, используя консольное приложение, и я наткнулся на этот исходный код в Интернете, и мне трудно его понять.

while(true)
{
    Thread.Sleep(10);

    for (int i = 0; i < 255; i++)
    {
        int keyState = GetAsyncKeyState(i);

        if (keyState == -32767)
        {
            Console.WriteLine((Keys)i);
        }
    }
}

Итак, насколько я понимаю, keystate — это в основном функция, которая сообщает, нажата ли клавиша в данный момент. Поскольку мы хотим проверить, проверяются ли какие-либо из 255 клавиш клавиатуры, нам нужен цикл for. Поправьте меня, если я ошибаюсь.

Итак, если клавиша, которую мы сейчас нажимаем, хорошо... нажата, она вернет некоторое значение (Хотелось бы знать, какое это значение... может быть, значение кода клавиши? Поправьте меня, потому что я уверен, что ошибаюсь).

Но ЕСЛИ — это та часть, где я полностью потерял ее. Если я правильно понимаю, то строка записи произойдет только в том случае, если мы получим -32767, а это кто знает что? И это то, что я хотел бы знать. Почему это -32767? Почему это работает, даже если мы никогда не получим -32767, например, LMB равно 1...?


person Erik9631    schedule 15.05.2015    source источник
comment
Прочитайте раздел «Код возврата» страницы msdn — если установлен старший бит, то клавиша нажата, а если она была нажата с момента последнего звонка, то младший бит равен единице — что соответствует -32767 === 0x8001   -  person Petesh    schedule 16.05.2015
comment
@Petesh Ваш комментарий достоин ответа, если вы также предоставите ссылку на страницу MSDN :).   -  person John Odom    schedule 16.05.2015
comment
Итак, почему вы используете код, который не понимаете?   -  person John Saunders    schedule 16.05.2015


Ответы (1)


Если я правильно понимаю, то строка записи произойдет только в том случае, если мы получим -32767, а это кто знает что?

Значение -32767 (0x8001) является важным значением. GetAsyncKeyState возвращает short, что означает, что это младший значащий бит (0) 16-битного возвращаемого значения.

Согласно документам:

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

person Yuval Itzchakov    schedule 15.05.2015