Отправить сообщение игрового контроллера в гоночную игру, используя Xinput
У меня есть игровой контроллер на руле. Теперь я пытаюсь написать драйвер для игры в гонки, такой как NFS-17. Я знал, что игра использует Xinput. Я напишу драйвер на языке C. Мои вопросы: 1) Как отправить сообщение в игру, когда я повернул руль. 2) это с помощью SendMessage (). 3) Если использовать SendMessage (), как получить дескриптор окна игры и какие wParam и lParam я должен отправить.
1 ответ
XInput для контроллеров xbox360. Для оси X рулевого колеса вы можете использовать два триггера геймпада. XInput - это не что иное, как метод получения / установки:P Он получает информацию о состоянии подключенного контроллера и сообщает, есть ли что-то подключенное или нет, только по вашему запросу, он не отслеживает и не сохраняет что-либо и не отправляет сообщения приложениям, которые иметь фокус ввода. Отправка сообщений - это ваша работа с приложением, которое вы можете создать. Теперь до того, что вам действительно нужно. Вы можете написать простое приложение на C++, которое будет сканировать состояние контроллера, но подождите... у вас нет контроллера xbox360:P Итак, сначала проверьте, как ваше приложение будет реагировать на ваш руль с помощью драйвера oem. Если вы не можете прочитать его как подключенный к любому USB-порту (проверьте в MSDN GetInputState()), затем попробуйте использовать универсальный драйвер Windows (пусть он устанавливает то, что ему подходит, он может даже воспринимать ваш руль как xbox360, они очень похоже на точку, разница в количестве осей и кнопок с более дорогими колесами). Затем, когда вы достигли фактического чтения состояния вашего контроллера (рулевого колеса), используйте GetHDC(дескриптор окна), где дескриптор окна извлекается через (я не помню точно)FindWindow(имя / заголовок окна). Используйте alt-tab, чтобы навести курсор мыши на любой заголовок, используемый для окна игры. Когда вы владеете дескриптором окна и контекстом устройства, вы можете отправлять сообщения на его функцию обратного вызова WndProc corespondent через дескриптор окна и даже отображать тексты / рисовать изображения / фигуры через контекст устройства. Сообщения должны быть соответствующими кодами виртуальной клавиши (например, VK_UP для стрелки ВВЕРХ... посмотрите на нее), которые будут нажиматься на клавиатуре, если колесо недоступно. Хитрость заключается в том, чтобы имитировать ШИМ для каждого градуса вращения колеса. Просто отправьте высокочастотные сообщения с чередованием нажатия / отпускания кода клавиши VK_LEFT для высокой степени поворота колеса влево и для блокировки рулевого управления, просто отправьте одно сообщение KEY_DOWN, пока не будет снята блокировка рулевого управления, а затем сообщение KEY_UP, за которым следует соответствующий частота чередования снова. Для низких градусов колеса делайте большие паузы между сообщениями нажатия / отпускания клавиши. Бонусом создания драйвера является то, что вы можете настроить чувствительность, соотношения кнопок, мертвые зоны по своему вкусу.
С другой стороны, уже есть симуляторы, подобные этому, и затем вы снова можете построить свой собственный руль с передачей 6+1, используя только интерфейс 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]. [-Fullbrake],fullacceleration]).