Поддельный ввод, как GlovePIE - PullRequest
       3

Поддельный ввод, как GlovePIE

3 голосов
/ 21 ноября 2011

Я программировал на Kinect, и теперь я хочу, чтобы игры реагировали на то, что я делаю на Kinect.На самом деле легко отправлять данные в блокнот для нажатия клавиш, но гораздо сложнее отправлять их в игры.

Прежде всего, я использовал пример скелета WPF из Kinect и сейчас создаю его.Я мог бы использовать версию C ++, но мой C ++ очень ржавый, и я бы предпочел не делать этого.

Итак, вот что я сделал до сих пор, я попытался SendKeys, SendInput, keybd_event, Post_Message.Никто из них не попал в такие игры, как Burnout Paradise.

Я знаю, что ввод GlovePIE попадает в игры, но как?В настоящее время моя работа с / hack заключается в использовании PPJoy, который имеет образец кода на C ++ для эмуляции нажатий кнопок.Я вызываю это через [DllImport] из моего приложения WPF.Затем я поднимаю нажатие кнопки джойстика в GlovePIE и преобразую их в клавиши клавиатуры.Так что я хожу по кругу, который работает, но драйвер PPJoys не подписан, поэтому я не могу на самом деле поделиться этим кодом, так как люди должны были бы разрешить драйверы с подписью тестов.Нажатия клавиш бывают?Я разместил на форумах GlovePIE, но никаких ответов.У GlovePIE есть хакерская работа со старыми драйверами openNI kinect, но я использую стандартную версию Microsoft, выпущенную несколько недель назад.

Ответы [ 3 ]

1 голос
/ 15 января 2012

Хорошо, не уверен, что такое совок, когда отвечаешь на твой собственный вопрос, но я разобрался со всем правильным решением и хотел бы поделиться им как Отмеченный ответ.

Сначала включите это, используя утверждение

using System.Runtime.InteropServices;

Тогда вставь это в свой класс, это в свой класс

[DllImport("user32.dll", EntryPoint = "keybd_event", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern void Keybd_event(byte vk, byte scan, int flags, int extrainfo);

Это импортирует метод C для использования в C #. Теперь некоторые игры / приложения используют виртуальные ключи VKey, а некоторые (Direct X aka DIKey) используют сканкоды. Моя проблема заключалась в том, что я неправильно использовал коды сканирования, поэтому он не работал в некоторых играх. Я предлагаю, если вы не знаете, какое приложение хочет их использовать, вы называете это дважды, один с виртуальным ключом и один для ключа прямого ввода

Ниже приведен пример двух вызовов буквы «А» с использованием виртуальных ключей, а затем ключей прямого ввода.

KEYDOWN = 0
KEYUP = 2
//Virtual Key
Keybd_event(65, 0, KEYDOWN, 0);

//Direct Input Key
Keybd_event(0, 30, KEYDOWN, 0);

Как вы можете сказать, значения для A отличаются от VK до DIK Обе ссылки относятся к значениям HEX, в то время как мои примеры выше показывают Base 10 (целые числа)

Ссылка на ключ http://delphi.about.com/od/objectpascalide/l/blvkc.htm

DIKeys ссылка http://community.bistudio.com/wiki/DIK_KeyCodes

Это также должно работать и для SendInput, но я не полностью это подтвердил.

0 голосов
/ 07 декабря 2011

Хотя я не скажу, что это лучший ответ, я хотел бы вернуться к решению, которое я использую. Я обнаружил, что могу использовать vJoy http://headsoft.com.au/index.php?category=vjoy, который подписан, поэтому он может быть использован в Windows 7 64 бит. Я могу назвать это extern keybd_event

[DllImport("user32.dll", EntryPoint = "keybd_event", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern void Keybd_event(byte vk, byte scan, int flags, int extrainfo);

Оттуда я могу Keybd_event(CKEY, SCANCODE, KEYDOWN, 0);, затем через X кадр позвонить Keybd_event(CKEY, SCANCODE, KEYUP, 0);

Я установил vJoy для чтения "c" или других ключей, которые я посылаю через keybd_event. vJoy правильно читает это и затем «нажимает» соответствующую кнопку, которую GlovePIE поднимает. Так что в GlovePIE мой скрипт выглядит так:

A = joystick1.Button1
Z = joystick1.Button2

Что работает в играх, которые я пробовал. Это определенно не идея, но она работает и позволяет конечному пользователю настраивать ввод через vJoy и GlovePIE.

0 голосов
/ 22 ноября 2011

Я не знаю GlovePIE, извините, но, возможно, это может помочь.

PostMessage и SendMessage ведут себя по-разному, когда имитируют нажатия клавиш.Также помогло бы узнать, какое сообщение вы на самом деле отправляете, нажатие клавиши / вверх, нажатие клавиши и т. Д.

Возможно, вам придется что-то предпринять для изменения фокуса - возможно, выбран неправильный элемент или ваша отправка неверна) window.

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

Можно также нажать клавишу, чтобыПовторите механизм отправки нескольких ключевых сообщений, обычно в играх, когда вы удерживаете клавишу нажатой, чтобы повернуть ее, а не просто нажать ее один раз.

...