c # — Перехват и отмена событий нажатия клавиш для игры DirectX

Я работаю над небольшим инструментом для игры DirectX и хочу, чтобы пользователь не нажимал определенную клавишу (в данном случае F12) в течение определенного периода.

Я мог бы найти много вариантов для моделирования нажатий клавиш, но какие есть варианты, когда дело доходит до обнуления нажатия клавиш до того, как игра его прочитает?

Язык на самом деле не имеет значения, хотя я бы предпочел решение на C # или C ++ или просто толчок в правильном направлении 🙂

Заранее спасибо!

0

Решение

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

Плохая новость в том, что это не просто. Он требует много сложного кода и, вероятно, займет много времени для реализации, но я объясню, как вы можете это сделать.

Такие приложения, как игры DirectX обычно зарегистрироваться для необработанного ввода.
Поскольку вы хотите, чтобы событие клавиатуры не доходило до приложения, вам нужен способ вставить свой код между необработанным вводом и игрой, чтобы вы могли проверить необработанный ввод и решить, следует ли разрешить его передачу в игру:

Итак, вы хотите изменить поток из:

Raw Input --> Game

в

Raw Input --> Your Code --> Game

Не имея доступа к исходному коду игры, вы должны найти способ вставить свой код.

Когда будет доступен ввод с клавиатуры, игра вызовет функцию WinAPI GetRawInputData, который расскажет это о событии клавиатуры. В идеале, когда мы вызываем эту функцию, игра на самом деле вызывает наш код вместо функции WinAPI. Затем мы можем решить, что сказать игре о событии на клавиатуре, мы можем сказать ей все, что захотим (например, игнорировать F12). Звучит отлично, правда? Вот где это становится интересным …

Мы можем воспользоваться тем, как Windows загружает исполняемые файлы в память. Как правило, программа использует (или «импортирует») вызовы функций в других DLL (например, GetRawInputData, в User32.dll). Когда программа загружается в память, Windows заполняет таблицу (Таблица адресов импорта (IAT)) с указателями на исполняемый код в соответствующих библиотеках DLL. Это означает, что когда программа вызывает функцию, она направляется к исполняемому коду в User32.dll в памяти, чтобы запустить ее.

Не было бы замечательно, если бы мы могли записать / исправить адрес одной из наших функций в этой таблице, чтобы при вызове игры GetRawInputData, это на самом деле направлено на нашу функцию для нас, чтобы обработать? Ну, мы можем! Это называется Импортирование таблицы адресов.

Там довольно хорошо статья об этом здесь с некоторым рабочим кодом в C ++. Сначала вы должны прочитать его, чтобы понять более подробно, как он работает, затем вы можете изменить его в соответствии со своими потребностями. Это сработает, но я знаю, что это, вероятно, больше работы (гораздо больше работы), чем вы ожидали, но, по сути, вы взламываете приложение, которое никогда не бывает легко сделать.

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

Удачи!

РЕДАКТИРОВАТЬ

Как сказал Саймон, Windows Hooks — намного более простой способ сделать это если игра не использует необработанный ввод. Игры DirectX, как правило, представляют собой особый случай, который не очень хорошо работает со стандартными хуками, поскольку они используют специальные методы для получения информации от пользователя. Конечно, попробуйте, будет намного проще, если это сработает.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]