Почему мои горячие клавиши не работают при использовании `GetAsyncKeyState ()` в Win32?

main.c:

#include <stdio.h>
#include <windows.h>
#include <stdbool.h>

int main(void) {
while (true) {
if (GetAsyncKeyState(VK_CONTROL)) {
if (GetAsyncKeyState('1')) {
printf("Set grenades to 100!\n");
Sleep(500);
}
}

Sleep(100);
}

return 0;
}

Я пробовал переключаться между режимами отладки и выпуска, между компиляторами mingw и VS, и я устал от C и C ++. Одна и та же ошибка случается во всех случаях.

Идея состоит в том, что горячая клавиша — Control + 1. Когда пользователь нажимает одновременно клавишу Control и клавишу 1, я хочу код printf("Set grenades to 100!\n"); быть запущенным.

Тем не менее, есть ошибка. Если пользователь нажимает и отпускает клавишу 1. Ожидает любое количество времени (секунды, минуты), а затем нажимает клавишу управления, printf("Set grenades to 100!\n"); выполнен.

Эта ошибка возникает, даже если пользователь нажимает клавиши между ними. Например: printf("Set grenades to 100!\n"); выполняется, если пользователь делает следующее:

  1. Нажмите 1 клавишу.
  2. Отпускает 1 ключ.
  3. Нажимает и отпускает следующие клавиши: «H», «i», «S», «t», «a», «c», «k», «o», «v», «e», «r» , ‘f’, ‘l’, ‘o’, ‘w’ и ‘2’.
  4. Нажимает и отпускает контрольный ключ.

На шаге 4 код выполняется. Как мне исправить эту ошибку?

Я хочу использовать GetAsyncKeyState, а не GetKeyState, потому что я хочу, чтобы ввод был захвачен, даже если пользователь переключается на другую программу.

1

Решение

Относительно возвращаемого значения GetAsyncKeyState(), в соответствии с Microsoft, Если самый важный бит установлен, ключ не работает.
Важный вывод здесь: для подписанных типов, таких как short, когда самый важный бит установлено, это читается как отрицательное число. GetAsyncKeyState() возвращается short,

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

Еще одна заметка: как и предполагали другие, цель GetAsyncKeyState() это проверить состояние ключа сейчас. Но это возвращаемое значение также содержит информацию, чтобы определить, была ли нажата клавиша относительно недавно. На самом деле это то, что вы будете делать, глядя на LSB. В той же ссылке объясняется, что LSB является индикатором недавний статус Однако это не рекомендуемая практика. недавний битовый статус может быть установлен любым процессом, запущенным в другом потоке, в любое время, поэтому его следует использовать только с осторожностью.

Итак, попробуйте это вместо. Я проверил это на 64-битных окнах, кажется, что он работает нормально, независимо от того, сколько раз я нажимаю 1 или нажимаю ctrl ключ, всплывающее окно не происходит. Но когда я нажимаю оба одновременно, то он выскакивает.

#include <stdio.h>
#include <windows.h>
//#include <stdbool.h>//I did not need this, you might.

int main(void) {
while (1)
{
if (GetAsyncKeyState(VK_CONTROL)<0)
{

if (GetAsyncKeyState('1')<0)
{
printf("Set grenades to 100!\n");
Sleep(200);//changed here for my test, you might need to change again
}
}
Sleep(200);//changed here for my test, you might need to change again
}

return 0;//unreachable code warning
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]