Определяет ли GetKeyState (), освобождается ли ключ?

#c #windows #winapi #input #keyboard

Вопрос:

Есть ли способ определить, освобождается ли ключ с помощью GetKeyState() ? Я читал об этом, и у него всего 2 состояния, переключил 0x8000 и нажал 0x01.

Я хочу что-то вроде этого:

 short Input(int Key, int Mode)
{
   if (Mode == KEY_RELEASE)
      if (GetKeyState(Key) amp; KEY_PRESS)
         //Wait for the key to be released
      else
         return GetKeyState(Key) amp; KEY_PRESS;
}
 

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

1. Нет. Единственный способ обнаружить ключ release с помощью этой функции-кэшировать значение ключа. Если клавиша была нажата в прошлый раз, когда вы проверяли, а сейчас ее нет, она была отпущена. Подумайте о том, чтобы изучить другие способы обработки входных данных.

2. Какую проблему вы пытаетесь решить?

3. @IInspectable Я пытаюсь обнаружить выпуски ключей с помощью функции GetKeyState, но у нее нет состояния выпуска.

4. Он имел в виду в целом, зачем вам нужно знать, когда был выпущен ключ? Вас волнует только ваше собственное окно или все процессы в системе и т. Д.

5. @Anders Я хочу знать, освобождается ли ключ, потому что я создаю систему ввода для фреймворка, над которым работаю, меня волнует только мое окно.

Ответ №1:

GetKeyState возвращает информацию о состоянии ключа текущей входной очереди (вашего потока и подключенных потоков). Вы можете получить аналогичную информацию для всех ключей с GetKeyboardState помощью .

Эти две функции следует использовать только в ответ на какое-то событие, вы не должны опрашивать снова и снова, чтобы обнаружить изменения.

Лучший способ обнаружить изменения клавиатуры в Windows, которыми вы управляете, — это обрабатывать сообщения WM_KEYDOWN/UP и WM_CHAR.

В худшем случае используйте SetWindowsHookEx для перехвата событий клавиатуры или сообщений окна.