Отправить сообщение контроллера игры в гоночную игру использовать Xinput

101
12

У меня есть контроллер рулевого колеса. Теперь я пытаюсь написать драйвер для игры в гонку, такой как NFS-17.I знал, что игра использует Xinput.Я напишу драйвер в C. Мои вопросы: 1) Как отправьте сообщение в игру, когда я повернул рулевое колесо. 2) Использует ли SendMessage(). 3) Если используется SendMessage(), как получить дескриптор окна игры и какие wParam и lParam следует отправить.

спросил(а) 2021-01-19T19:54:15+03:00 6 месяцев, 2 недели назад
1
Решение
135

XInput предназначен для контроллеров xbox360. Для оси X рулевого колеса вы можете использовать два триггера геймпада. XInput больше не имеет геттер/сеттер: P Он получает состояние подключенного контроллера и сообщает, что есть что-то подключенное или нет только по вашему запросу, оно не отслеживает и не сохраняет ничего в любом месте и не отправляет сообщения в приложения, которые имеют фокус ввода. Отправка сообщений - это ваша работа с помощью приложения, которое вы могли бы создать. Теперь, вплоть до того, что вам действительно нужно. Вы можете написать простое приложение C++, которое будет проверять состояние контроллера, но подождите... у вас нет контроллера xbox360: P Итак, сначала проверьте, как ваше приложение будет реагировать на ваше рулевое колесо с помощью своего драйвера oem. Если вы не можете прочитать его как подключенный к любому порту usb (проверьте в MSDN GetInputState()), попробуйте использовать общий драйвер Windows (пусть он установит все, что ему подходит, он даже может воспринимать ваше рулевое колесо как xbox360, они очень подобно точке, разница - это количество оси и кнопок с более дорогими колесами). Затем, когда вы действительно прочитали состояние своего контроллера (рулевого колеса), используйте GetHDC (windowhandle), где извлекается дескриптор окна (я точно не помню) FindWindow (имя/название окна). Используйте alt-tab для проверки с помощью мыши, независимо от названия, используемого для игрового окна. Когда у вас есть дескриптор окна и контекст устройства, вы можете отправлять сообщения на свой вызов обратно через функцию дескриптора WndProc через дескриптор окна и даже выводить тексты/рисовать изображения/фигуры через контекст устройства. Сообщения должны соответствовать соответствующим кодам виртуальных клавиш (например, VK_UP для стрелки ВВЕРХ... посмотрите), которые будут нажаты на клавиатуру, если бы не было доступного колеса. Хитрость заключается в моделировании ШИМ для каждой степени вращения колеса. Просто отправьте высокочастотные сообщения чередующегося нажатия/отпускания кода клавиши VK_LEFT для высокой степени поворота колеса влево и для блокировки рулевого управления просто отправьте одно сообщение KEY_DOWN до тех пор, пока блокировка рулевого управления не будет удалена, а затем сообщение KEY_UP, а затем соответствующее сообщение частота чередования снова. Для низких градусов колеса делают большие паузы между сообщениями нажатия/отпускания клавиши. Бонус при создании драйвера заключается в том, что вы можете настроить чувствительность, корреляцию кнопок, мертвые зоны по своему усмотрению.

С другой стороны, есть такие симуляторы, как это уже, а затем снова вы можете создать свое собственное рулевое колесо с передачей 6 + 1, используя только API связи usb (чтение/запись данных с/на USB-порт, ничего необычного :)) из окон, микроконтроллер (PIC, atmega, nxp и т.д., что дешевле и с аппаратным USB на готовом или плюс контроллере usb), переменные резисторы для оси X, Y и т.д. и некоторые части для системы управления. Удачи и сообщения на youtube: P!

PS Черт, это уже слишком поздно, но эй... Я чувствовал, что мне нужно написать какое-то мамбо-джамбо, которого я никогда не делал, но что бы сработало... если бы я не был таким ленивым. :)

Обновление: xInput может работать, если он совместим (возможно, с высокими колесами и радостями), но directx знает о рулевых колесах тоже, все они. Для меня это было единственным решением. Microsoft заявляет, что XInput и directX должны использоваться, поскольку XINput предлагает аудио и многое другое для совместимых продуктов. Алгоритм звучит, хотя и открыт для многих реализаций. Я успешно реализовал его для GTA SA, поскольку выделенные инструменты не поддерживали мою версию. Теперь у меня есть Acc и Brake с педалей, наконец :) Я использовал таймер для достижения определенной частоты (по собственному выбору, эмпирический материал) и модулировал ширину импульса от почти 0 до полного периода (легкое касание педали и непрерывно применяемая педаль к металлу). На каждом импульсе я отправил два сообщения: клавиши W/S вниз в начале импульса и клавиши W/S вверх, когда вычисленная ширина импульса достигла своего конечного значения. Формула для ширины импульса - это процентная доля от общей ширины, того же процента или изменена с помощью настройки чувствительности, например, педаль прошла от ее максимального расстояния (DirectInput сообщает о целочисленном числе в [-1000, 1000]. Я думаю. [[ CN01], fullacceleration]).

ответил(а) 2021-01-19T19:54:15+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема