Вопрос

Как бы я пошел о создании «GamePad», который, по-видимому, намеряет приложения для использования в качестве обычного игрового контроллера, но состояние его элементов управления на самом деле определяется программным обеспечением?

Это было полезно?

Решение

Написать драйвер устройства, чтобы притвориться одним.

В частности, драйверы устройств Windows обрабатывают то, что называются запросами прерывания через протокол запроса прерывания - который сводится к обернутую структуру и набор буферов внутри водителя.

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

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

Это открывает возможность управления драйвером через приложение для пользователя и притворяется «быть» устройством. Для отправки сообщений драйверов вы можете DeviceIoControl к нему; Затем на самом деле получить эти сообщения, которые вы можете:

    .
  • веща их в IRP, который составляет это устройствооконтрол.
  • У водителя прочитайте их из вашего процесса памяти.
Драйверы

могут также получить доступ к генеракодичению и различным другим, не имеющим пользовательских зонах реестра неиспортеров, поэтому можно так можно связать.

Наконец, нет ничего сказать, что вы не можете отфильтровать существующие IO, а не все сделать через новое устройство. Существует множество вариантов и способов, которыми вы можете сделать это.

Если вы собираетесь сделать это, вам понадобится:

    .
  • virtualkd или дорогой кабель отладчика и два шт.
  • Вы, вероятно, также хотите начать с ссылок на Этот блог Post . Вы обнаружите, что существуют различные имена базильона для кода драйверов, поэтому я интерпретирую некоторые из них:

      .
    • WDM= модель драйвера Windows, в основном модель драйвера NT, смешанная с (некоторые из) Windows 9x.
    • kmdf= каркас драйвера режима ядра - драйверы приведенного выше типа Используйте это, плюс дополнительно WDF (Foundation Windows Driver), который является набором библиотек в верхней части WDM, чтобы сделать его быстрее в использовании.
    • umdf= Структура драйвера режима пользователя - напишите драйвер без опасности режима ядра. Если вы сможете, используйте это, как драйверы режима ядра, которые идут не так, будет BlueScreen (в разделении драйверов, BugCheck) вашей системы.

редактируйте : я не массовый знающий на directinput - может быть способ переопределить различные элементы управления API с помощью перенаправления DLL и тому подобное, что может быть проще, чем то, как я ' описал.

Другие советы

Самое простое решение может быть эмулированию устройства Xinput (Xbox 360 и один).Они поддерживаются в большинстве современных игр, и настройка очень проста.Вот проект C ++ здесь, который предоставляет это без каких-либо установленных драйверов или внешних зависимостей: https://github.com/shauleiz/ vxboxinterface /

Есть проект Voy Opensource: http://sourceforge.net/projects/vjoystick/ -можно стоит посмотреть.

Я знаю, что это старый вопрос, но для тех, кто заинтересован в этой теме, также стоит посмотреть на этот проект под названием Vigem .

Вы можете эмулировать некоторые известные GamePads, такие как Microsoft Xbox 360 контроллер, контроллер Sony Dualshock 4 и контроллер Microsoft Xbox One.Проект также предлагает некоторые API для взаимодействия с этими виртуальными контроллерами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top