Есть несколько способов поймать мышь или клавиатуру под Windows. Я попробовал некоторые из них, но у каждого из них есть свои преимущества и недостатки. Я хочу спросить вас: какой метод использовать?
Я пробовал это:
WM_KEYDOWN / WM_KEYUP - Главный недостаток заключается в том, что я не могу различать левых и правых клавиш, как ALT, CONTROL или SHIFT.
GetKeyboardState - Это решает проблему первого метода, но есть новый один. Когда я получаю, что нажата правая клавиша ALT, я также получаю, что левая клавиша управления нажата. Такое поведение происходит только при использовании локализованной раскладки клавиатуры (чешский - CS).
WM_INPUT (необработанный ввод) - этот метод также не различает левые и правые клавиши (если я помню), и для движения мыши иногда генерирует сообщение с нулевыми значениями дельта положения мыши.
Есть ли причина, по которой вы не можете объединить их? Например, используйте WM_KEYDOWN, чтобы обнаружить нажатие клавиши Ctrl / Alt / Shift, затем в этом вызове используйте GetKeyboardState (), чтобы отличить левую от правой?
источник
WM_INPUT это хорошо. Я думаю, что вы можете различить левую / правую клавиши, используя структуру RAWKEYBOARD . Сложная часть может заключаться в том, чтобы выяснить, как обращаться с идентификаторами клавиш (то есть скан-кодами), но я не могу сказать, поскольку я никогда не пытался использовать это для ввода с клавиатуры. WM_KEYDOWN это так просто :)
Я использовал WM_INPUT для ввода мышью, хотя. Это очень низкий уровень. У него нет ускорения, что очень хорошо (IMO). WM_INPUT был единственным способом воспользоваться движением мыши с высоким разрешением, но я не уверен, что это все еще так. Смотрите эту статью MSDN от 2006 года .
DirectInput для мыши / клавиатуры явно не рекомендуется Microsoft. Смотрите ранее связанную статью MSDN. Если вам нужен джойстик, XInput, вероятно, является подходящим вариантом.
РЕДАКТИРОВАТЬ: Моя информация об этом может быть слишком устаревшим.
источник
На самом деле, кроме L / R Ctrl / Alt, когда вы ловите WM_KEYDOWN / WM_KEYUP, вы можете. Легко, это не так, но код, который я использую, здесь вы можете иметь, хм хм.
Надеюсь, это все еще работает, я делаю.
источник
Вы можете попробовать DirectInput API или, в последнее время, XInput API .
источник