Ключевой слушатель / регистратор, использующий GetAsyncKeyState () - PullRequest
0 голосов
/ 03 ноября 2011

Я видел, что многие люди могли использовать цикл 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);
     }
}
}

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

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

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

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

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

Кроме того, не делайте глупых ключей регистрации ...

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

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

0 голосов
/ 03 ноября 2011

Посмотрите на это .

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

unsigned char kbstate[256];
if(!GetKeyboardState(kbstate))
{
   // can not get keyboard state
}else{
   for(int i=0; i<256: i++)
   {
      if(kbstate[i] & 0x1)
      {
         // the key is pressed, do something
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...