像GlovePIE一样伪造输入

时间:2011-11-21 18:24:53

标签: c# c++ wpf kinect

我一直在针对Kinect进行编程,现在我想让游戏对我在Kinect上做的事做出反应。将数据发送到记事本以进行按键操作非常容易,但要将其发送到游戏则要困难得多。

首先,我一直在使用Kinect的WPF Skeleton示例并暂时改进它。我可以使用C ++版本,但我的C ++非常生疏,我宁愿不这样做。

所以这是我到目前为止所做的,我尝试过SendKeysSendInputkeybd_eventPost_Message。这些都不适合像Burnout Paradise这样的游戏。

我确实知道GlovePIE输入到了游戏,但是怎么样?目前我的工作/黑客,是使用PPJoy,它有C ++示例代码来模拟按钮按下。我通过我的WPF应用程序中的[DllImport]调用此方法。然后我在GlovePIE中按下操纵杆按钮并将它们转换为键盘键。所以我绕了一圈,但是PPJoys驱动程序没有签名,所以我不能真正共享这段代码,因为人们必须允许测试签名的驱动程序。

有谁知道GlovePIE如何让他们的Keypresses发生?我已在GlovePIE论坛上发帖,但没有回复。 GlovePIE对旧的openNI kinect驱动程序有一点点破解,但我使用的是几周前最近发布的标准微软版本。

3 个答案:

答案 0 :(得分:1)

好的,不知道勺子在回答你自己的问题时是什么,但我找到了整个正确的解决方案并希望分享为Checked off Answer。

首先包含此使用声明

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#中使用。 现在一些游戏/应用程序使用Virtual Keys VKey,而一些(Direct X aka DIKey)使用Scancodes。我的问题是我使用了不正确的扫描码,所以它对某些游戏不起作用。我建议如果您不知道应用程序想要使用这些应用程序,请使用虚拟密钥将其称为两次,将直接输入密钥称为一次

以下是使用虚拟密钥然后使用直接输入密钥对字母“A”进行两次调用的示例。

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(整数)

VKeys链接http://delphi.about.com/od/objectpascalide/l/blvkc.htm

DIKeys链接http://community.bistudio.com/wiki/DIK_KeyCodes

这也适用于SendInput,但我还没有完全验证过。

答案 1 :(得分:0)

我不知道GlovePIE,对不起,但也许这些可能会有所帮助。

PostMessage和SendMessage在处理模拟击键时会有不同的行为。 还有助于了解您实际发送的消息,keydown / up,keypress等。

您可能需要做一些关于更改焦点的事情 - 可能选择了错误的元素,或者您发送到了错误的(子)窗口。

同样,如果您在模拟鼠标点击的位置,也可以检查鼠标的位置,以确保它仍然位于可点击区域。

考虑同时按住键会触发重复机制发送多个关键信息,通常在游戏中,按住键不仅仅需要点击一次。

答案 2 :(得分:0)

虽然我不会说这是最好的答案,但我想回顾我正在使用的解决方案。我发现我可以使用已签名的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自定义输入。

相关问题