Допустим, вы создаете игру для Mac OS X. Фактически, допустим, вы создаете Quake, только сейчас 2011 год, и вы предпочитаете использовать только современные, не устаревшие фреймворки.
Вы хотите, чтобы ваша игра была уведомлена, когда пользователь нажимает (или отпускает) клавишу, любую клавишу на клавиатуре. Это включает в себя модифицирующие клавиши, такие как Shift и Control. Отредактировано для добавления: Также вы хотите знать, была ли нажата левая или правая версия клавиши-модификатора.
Вы также хотите, чтобы в вашей игре был экран конфигурации, где пользователь может просматривать и изменять конфигурацию клавиатуры. Он должен содержать такие вещи, как:
- Движение вперед: W
- Прыжок: ПРОБЕЛ
- Огонь: LCTRL
Что вы делаете? Я пытался найти хороший ответ на этот вопрос в течение дня или около того, но безуспешно.
Вот что я придумал:
- Подкласс NSResponder, реализуйте keyUp: и keyDown:, как в этот ответ . Проблема этого подхода заключается в том, что keyUp: и keyDown: не будут вызываться, когда пользователь нажимает только клавишу-модификатор. Чтобы обойти это, вы можете реализовать flagsChanged :, но это похоже на взлом.
- Использование Кварцевого события Нажмите . Это работает только в том случае, если приложение работает от имени пользователя root или пользователь разрешил доступ для вспомогательных устройств. Кроме того, события клавиш-модификаторов все еще не считаются обычными событиями клавиш.
- Используйте HIToolbox. Практически нет упоминаний об этом в документах для разработчиков 10.6. Кажется, это очень, очень устарело.
Итак, как правильно это сделать? Это действительно похоже на проблему, которая должна иметь хорошо известное, хорошо документированное решение. Это не похоже на невероятно нишевые игры.