Глобальный блок горячих клавиш обратного проектирования - PullRequest
4 голосов
/ 19 февраля 2012

Я пытаюсь перепроектировать (OllyDbg) приложение (игру), которое отключает (захватывает / перехватывает / блокирует) все глобальные горячие клавиши, когда его окно (D3D) активно (кроме Ctrl-Alt-Del).

У меня вопрос, каким образом такое приложение может захватывать / отключать глобальные горячие клавиши (в том числе winkey, CTRL + Esc и глобальные горячие клавиши, установленные в других приложениях), когда его окно активно?

Кажетсяиспользовать DirectInput (если это имеет значение).Я вижу, что он не устанавливает никаких низкоуровневых хуков (SetWindowsHookEx).Какими еще способами это можно сделать?

Наблюдения сделаны:

  • Когда приложение приостановлено (пока его окно все еще находится в фокусе), горячие клавиши по-прежнему отключеныпока окно находится в фокусе.Переключение окна на что-то другое позволяет им.При возврате к окну приостановленных приложений горячие клавиши снова отключаются.
  • Если сделать то же самое, но приостановить работу приложения после того, как окно потеряло фокус, а затем переключиться обратно к приостановленному окну, горячие клавиши полностью работают.
  • Редактировать: Приложение, похоже, блокирует глобальные горячие клавиши, установленные с помощью RegisterHotKey, но не отключает никакие горячие клавиши, созданные с помощью ловушки (SetWindowsHookEx).

Эксперимент выше показывает, что некоторые настройки, связанные с окном, работают даже тогда, когда приложение приостановлено.Может быть, это какая-то настройка DirectInput?(Хотя я вижу только один вызов функции DINPUT API: DINPUT8.DirectInput8Create.)

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

1 Ответ

1 голос
/ 24 февраля 2012

Точно так, как Ханс Пассант предложил в комментариях, именно DirectInput вызывал такое поведение из-за флага DISCL_EXCLUSIVE, установленного с IDirectInputDevice8::SetCooperativeLevel.

...