像GlovePIE一样伪造输入
Faking Input Like GlovePIE
我一直在针对Kinect编程,现在我想让游戏对我在Kinect上的操作做出反应。将数据发送到记事本上按键很容易,但将数据发送到游戏中就难多了。
首先,我一直在使用Kinect的WPF骨架示例,并在此基础上进行构建。我可以使用c++版本,但是我的c++已经很生疏了,所以我不想使用。
所以这是我到目前为止所做的,我已经尝试了SendKeys
, SendInput
, keybd_event
, Post_Message
。这些都没有出现在像《Burnout Paradise》这样的游戏中。
我知道GlovePIE输入得到游戏,但如何?目前我的工作是使用PPJoy,它在c++中有样例代码来模拟按钮按下。我通过我的WPF应用程序中的[DllImport]调用它。然后我在GlovePIE中拾取操纵杆按钮,并将其转换为键盘键。所以我绕了一个圈,这是有效的,但PPJoys驱动程序没有签名,所以我不能真正分享这个代码,因为人们必须允许测试签名的驱动程序。
有谁知道GlovePIE是如何让他们的按键发生的吗?我已经张贴在GlovePIE论坛,但没有回应。GlovePIE对旧的openNI kinect驱动程序进行了一些修改,但我使用的是几周前发布的标准微软版本。
好吧,我不知道如何回答你的问题,但是我想出了一个完整的正确的解决方案,并想分享给大家。
首先包含using语句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和一些(直接X又名DIKey)使用扫描码。我的问题是我使用扫描码不正确,所以它不适合一些游戏。我建议如果你不知道什么应用程序想要使用这些,你调用它两次一个是虚拟键,一个是直接输入键
下面是一个使用虚拟键调用字母'A'的例子,然后使用直接输入键。
KEYDOWN = 0
KEYUP = 2
//Virtual Key
Keybd_event(65, 0, KEYDOWN, 0);
//Direct Input Key
Keybd_event(0, 30, KEYDOWN, 0);
可以看出,从VK到DIK A的值是不同的这两个链接都与HEX值相关,而上面的示例显示的是Base 10(整数)
VKeys link http://delphi.about.com/od/objectpascalide/l/blvkc.htm
DIKeys link http://community.bistudio.com/wiki/DIK_KeyCodes
这也应该适用于SendInput,但我还没有完全验证。
我不知道GlovePIE,抱歉,但也许这些会有帮助。
PostMessage和SendMessage在模拟击键时会得到不同的行为。也有助于了解您实际发送的信息,按下/上键,按下键等。
你可能需要做一些事情来改变焦点——可能是选择了错误的元素,或者你发送到错误的(子)窗口。
同样,如果你在模拟鼠标点击,也可以检查鼠标的位置,以确保它仍然在可点击区域。
还可以考虑按住键触发重复机制,发送多个键信息,通常在游戏中,你按住键来转动而不仅仅是点击一次。
虽然我不会说这是最好的答案,但我想用我正在使用的解决方案来解决。我发现我可以使用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定制输入。
- 伪造事实↔false
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 为什么在C++中对链表这样做?(像堆叠一样处理它们)
- 堆栈和队列是否像C++中的数组一样传递?
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 如何在C++中伪造虚拟可变参数函数模板?
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- 我们可以将集合的值存储在变量中吗?就像我们可以将数组的值存储在变量中一样
- 我如何在C++像在 Python 中一样实现 f 字符串?
- 自制的上衣:看起来一样,但不完全相同
- 如何使用 redis-plus-plus 存储二进制数据,就像我想存储结构一样?@for_stack?
- 如何像在 C++ 中处理数组一样对 .txt 文件中的字符进行寻址?
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 像 CPP 中的控制台一样的应用程序
- 为什么C++中没有常量引用,就像常量指针一样?
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 有没有像给定的一样的 std::optional_function
- Java 是否像C++模板一样具有泛型推论?
- 记忆栅栏和记忆屏障是一样的吗
- 像GlovePIE一样伪造输入