Прослушиватель / регистратор ключей с использованием GetAsyncKeyState()

#c #winapi

#c #winapi

Вопрос:

Я видел, что многие люди могли использовать цикл for для определения значения нажатой клавиши, например, это было бы GetAsyncKeyState(41), и поэтому они могли бы легко использовать цикл, но по какой-то причине это работает только для меня, если я ввожу GetAsyncKeyState(0x41) и т. Д., Этоя могу что-то с этим сделать, чтобы я мог перебирать его вместо того, чтобы вводить каждое значение по отдельности?

 int main()
{
while(!GetAsyncKeyState(VK_F8))
{
    for(int i=65; i<90; i  )
    {

        if(GetAsyncKeyState(i))
        {
        log << "HELLO DER";
        }
        Sleep(200);
     }
}
}
  

Комментарии:

1. 41 != 0x41 . 0x41 == 65 как у вас там в цикле.

Ответ №1:

41 и 0x41 это два совершенно разных значения. Второй — 0x41 шестнадцатеричный для десятичного значения 65, которое является ASCII-кодом для ‘A’. Но я предполагаю, что вы уже знаете это, поскольку вы инициализируете i до 65 (прописные буквы ASCII и коды VK совпадают).

В любом случае ваш код почти работает нормально, если предположить, что вы пытаетесь регистрировать нажатия клавиш. Короче говоря, ваша задержка цикла слишком велика, чтобы она повторяла каждый символ, который требуется 200ms * 26 = 5.2 seconds . Поэтому, если вы введете «AAAB» в течение 5,2 секунд, будет зарегистрировано только «AB». Но если задержка слишком короткая, вы можете зарегистрировать нажатие более одного раза.

Прочитайте документацию для GetAsyncKeyState для получения дополнительной информации.

В любом случае я бы, вероятно, выбрал другую функцию, как указано в примечаниях к документации выше, что-то вроде GetKeyboardState, поскольку вы обычно используете что-то вроде GetAsyncKeyState для регистрации нажатий горячих клавиш или чего-то подобного. ie. GetAsyncKeyState полезно для того, чтобы узнать, была ли нажата клавиша, а не сколько раз, порядок нажатий и т. Д. Цикл, который у вас есть, кажется действительно подверженным проблемам.

Кроме того, не делайте ничего глупого, регистрируя ключи…

РЕДАКТИРОВАТЬ: на самом деле GetKeyboardState все еще не настолько хорошее решение. Установка клавиатуры с помощью SetWindowsHookEx была бы гораздо лучшей альтернативой. Вы могли бы использовать WH_KEYBOARD_LL тип перехвата, чтобы установить перехват клавиатуры низкого уровня с обратным вызовом LowLevelKeyboardProc.

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

Ответ №2:

Взгляните на это.

Использование довольно простое:

 unsigned char kbstate[256];
if(!GetKeyboardState(kbstate))
{
   // can not get keyboard state
}else{
   for(int i=0; i<256: i  )
   {
      if(kbstate[i] amp; 0x1)
      {
         // the key is pressed, do something
      }
   }
}