У меня есть контроллер рулевого управления. Теперь я пытаюсь написать драйвер для игры в гоночную игру, такую как NFS-17.I знал, что игра использует Xinput.I будет напишите драйвер в C. Мои вопросы: 1) Как отправить сообщение в игру, когда я повернул рулевое колесо. 2) Используется ли SendMessage(). 3) Если используется SendMessage(), как получить дескриптор игрового окна и какие wParam и lParam следует отправить.Отправить сообщение диспетчера игры для игры в гонку Xinput
ответ
XInput предназначен для контроллеров xbox360. Для оси X рулевого колеса вы можете использовать два триггера геймпада. XInput больше не имеет геттер/сеттер: P Он получает состояние подключенного контроллера и сообщает, что есть что-то подключенное или нет только по вашему запросу, оно не отслеживает и не сохраняет ничего в любом месте и не отправляет сообщения в приложения, которые имеют фокус ввода. Отправка сообщений - это ваша работа с помощью приложения, которое вы могли бы создать. Теперь, вплоть до того, что вам действительно нужно. Вы можете написать простое приложение на C++, которое будет проверять состояние контроллера, но подождите ... у вас нет контроллера xbox360: P Итак, сначала проверьте, как ваше приложение будет реагировать на ваше рулевое колесо с помощью своего драйвера oem. Если вы не можете прочитать его как подключенный к любому порту usb (проверьте в MSDN GetInputState()), попробуйте использовать общий драйвер Windows (пусть он установит все, что ему подходит, он даже может воспринимать ваше рулевое колесо как xbox360, они очень подобно точке, разница - это количество оси и кнопок с более дорогими колесами). Затем, когда вы достигли фактического считывания состояния вашего контроллера (рулевого колеса), используйте GetHDC (дескриптор окна), где извлекается дескриптор окна (я точно не помню) 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!
P.S. Черт, это уже слишком поздно, но эй ... Я чувствовал, что мне нужно написать какое-то мамбо-джамбо, которого я никогда не делал, но который бы сработал ... если бы я не был таким ленивым. :)
Обновление: xInput может работать в случае совместимости (возможно, с высокими торцевыми колесами и радостями), но directx знает о рулевых колесах тоже, все они. Для меня это было единственным решением. Microsoft заявляет, что XInput и directX должны использоваться, поскольку XINput предлагает аудио и многое другое для совместимых продуктов. Алгоритм звуков, хотя и открыт для многих реализаций. Я успешно реализовал его для GTA SA, поскольку выделенные инструменты не поддерживали мою версию. Теперь у меня есть Acc и Brake с педалей, наконец :) Я использовал таймер для достижения определенной частоты (по собственному выбору, эмпирический материал) и модулировал ширину импульса от почти 0 до полного периода (легкое касание педали и непрерывно применяемая педаль к металлу).На каждом импульсе я отправил два сообщения: клавиши W/S вниз в начале импульса и клавиши W/S вверх, когда вычисленная ширина импульса достигла своего конечного значения. Формула для ширины импульса - это процентная доля от общей ширины, того же процента или изменена с помощью настройки чувствительности, например, педаль прошла от ее максимального расстояния (DirectInput сообщает о целочисленном числе в [-1000,1000], я думаю. [-fullbrake , fullacceleration]).