Как мне создать виртуальный геймпад?
Как мне создать "геймпад", который представляется приложениям DirectInput как обычный игровой контроллер, но состояние его элементов управления фактически определяется программным обеспечением?
5 ответов
Напишите драйвер устройства, чтобы притвориться им.
В частности, драйверы устройств Windows обрабатывают так называемые запросы прерывания через протокол запроса прерывания, который сводится к закрытой структуре и ряду буферов внутри драйвера.
Теперь следующее, что вам нужно знать, - это то, что многие драйверы на самом деле являются многоуровневыми, или стековыми, или любым другим именем, которое вы хотите использовать. Так, например, чтобы написать драйвер диска, вы можете взаимодействовать с драйвером над ним (как класс диска), но использовать драйвер под ним (например, порт scsi) для фактической отправки команд на ваши устройства.
Вот как работают настоящие устройства. Поддельные устройства должны соответствовать требованиям интерфейса верхнего уровня, например, к диску или контроллеру, или к мыши, или к чему бы то ни было. Однако под ними они могут делать все что угодно - возвращать любые значения, которые им нравятся.
Это открывает возможность управлять драйвером через приложение пользовательского режима и притворяться "устройством". Чтобы отправить водителю сообщения, вы можете DeviceIoControl
к этому; затем, чтобы получить эти сообщения, вы можете:
- Наполните их в Irp, который составляет этот DeviceIoControl.
- Пусть драйвер прочитает их из пространства памяти вашего процесса.
Водители также могут получить доступ \\Registry\\Machine
и различные другие, не зависящие от пользователя области реестра, не относящиеся к исследователям, так что можно обмениваться данными таким образом.
Наконец, нельзя сказать, что вы не можете отфильтровать существующий ввод-вывод, вместо того, чтобы создавать все с помощью нового устройства. Существует множество вариантов и способов сделать это.
Если вы собираетесь это сделать, вам понадобится:
- VirtualKD или дорогой отладочный кабель и два ПК.
Вы, вероятно, также хотите начать со ссылок в этом блоге. Вы обнаружите, что для кода драйвера существует несколько разных имен, поэтому я объясню некоторые из них:
- WDM = Модель драйвера Windows, в основном модель драйвера NT, смешанная с (некоторыми из) Windows 9x.
- KMDF = Структура драйвера режима ядра - драйверы вышеупомянутого типа используют это, плюс дополнительно WDF (Windows Driver Foundation), который представляет собой набор библиотек поверх WDM для ускорения его использования.
- UMDF = Структура драйвера пользовательского режима - написать драйвер без опасности режима ядра. Если вы можете, используйте это, так как драйверы режима ядра, которые работают неправильно, будут синего экрана (на языке драйвера, bugcheck) вашей системы.
Редактировать: я не очень хорошо разбираюсь в DirectInput - может быть способ переопределить различные используемые элементы управления API с помощью перенаправления DLL и т. П., Который может быть проще, чем описанный мной.
Существует проект с открытым исходным кодом vJoy: http://sourceforge.net/projects/vjoystick/ - стоит посмотреть.
Я знаю, что это старый вопрос, но для всех, кто интересуется этой темой, также стоит взглянуть на этот проект под названием ViGEm.
Вы можете эмулировать некоторые известные геймпады, такие как Microsoft Xbox 360 Controller, Sony DualShock 4 Controller и Microsoft Xbox One Controller. Проект также предлагает API для взаимодействия с этими виртуальными контроллерами.
Самым простым решением может быть эмуляция устройства XInput (Xbox 360 и One). Они поддерживаются в большинстве современных игр, и их настройка очень проста. Вот проект C++, который обеспечивает это без каких-либо установленных драйверов или внешних зависимостей: https://github.com/shauleiz/vXboxInterface/
Самым простым решением, которое я нашел, было использование vJoy и его оболочки C#. Вам необходимо скачать драйвер vJoy отсюда.
Вы можете использовать vJoy SDK для реализации фидерной программы: https://github.com/njz3/vJoy/tree/master/SDK/c%23
Используйте для этого стартовый проект C# или просто добавьте два
.dll
-s в существующий проект в виде ссылок из папки x86 или x64. Вы можете найти инструкции по использованию api в файле readme.odt.