2012-04-10 5 views
3

У меня есть одна игра, и я пытаюсь показать одно наложение в игре; где пользователь может ввести свои данные. Проблема здесь в том, что нажатые пользователем клавиши доступны игровому источнику, и я хочу ограничить нажатие клавиш только наложением.
Я использую родную dll C++, чтобы показать наложение, которое использует CEF для рендеринга содержимого.
Есть ли способ сделать это в безопасном режиме, поэтому пользовательские детали не будут подвергаться какой-либо другой программе/процессу.
Ограничение клавиатуры до одного процесса

Любая помощь очень ценится.

+0

Вы пытались использовать e.handled = true в событии keydown? – Alain

+0

@Alain: Что? В сообщении Windows ничего подобного нет. – Puppy

+0

@DeadMG ['System :: Windows :: Forms :: KeyPressEventArgs^e'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keydown.aspx#Y0) '->' [ 'Handled'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.keypresseventargs.handled.aspx). Вопрос не был достаточно ясным, чтобы исключить возможность его актуальности. – Alain

ответ

0

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

нормальные шаги:

  • Создание DLL (должно быть, потому что вам нужно, чтобы загрузить его в другой процесс/адресное пространство), который перехватывает сообщения окна и делает первую фильтрацию. Обычно вы используете какой-то механизм IPC, чтобы получить формулу в свой собственный процесс. Если вы только привязываете сообщения мыши, вы можете использовать сообщения Windows для отправки информации одному скрытому сообщению. Если вы не хотите, чтобы сообщение появилось, вы можете остановить цепочку.

  • Когда вызов IPC поступает в ваше собственное окно; обрабатывайте его так, как будто вы получили сообщение с клавиатурой. Постарайтесь быть осторожным с фокусом и т.д.

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

Одно слово совета: при разработке программного обеспечения для подключения окон: экономьте часто, экономьте часто! Если вы допустили ошибку, вы могли бы сбить все множество приложений за один раз ...

+0

Спасибо за ваш ответ. Я попытался заблокировать клавиатурные сообщения с помощью SetWindowHookEx, но это не помешало игре получить штрихи клавиатуры. – Raj

+0

@Raj: Я бы сказал, что ваше первое действие должно быть: определить, как игра обнаруживает события клавиатуры; видимо, это не обычные сообщения WM_KEY *. Это могут быть асинхронные, низкоуровневые клавиатурные сообщения, возможно, они перехватывают сами сообщения и т. Д. Без этой информации он снимается в темноте. –

+0

Я использую игры на основе рамки Unity. Он использует класс Input Manager и Events для получения нажатий клавиш, и я считаю, что эти два класса работают в цикле Windows. У меня был небольшой успех в этом. Я использовал прямой ввод с эксклюзивным доступом к клавиатуре внутри моей родной DLL, и это помешало игре получить любые нажатия клавиш. Но поймать здесь, если кто-то еще имитирует поведение прямого ввода в своем собственном коде, они также могут получить нажатия клавиш. – Raj

Смежные вопросы