像GlovePIE一样伪造输入

本文关键字:一样 伪造 输入 GlovePIE | 更新日期: 2023-09-27 18:15:31

我一直在针对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驱动程序进行了一些修改,但我使用的是几周前发布的标准微软版本。

像GlovePIE一样伪造输入

好吧,我不知道如何回答你的问题,但是我想出了一个完整的正确的解决方案,并想分享给大家。

首先包含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定制输入。