像GlovePIE一样伪造输入

3
我一直在使用Kinect进行编程,现在想让游戏对我在Kinect上的操作做出反应。将数据发送到记事本以模拟键盘按键非常容易,但是将其发送到游戏则更加困难。
首先,目前我一直在使用Kinect提供的WPF Skeleton样例来开始我的项目。我也可以使用C++版本,但我的C++非常生疏,所以我不太愿意这么做。
到目前为止,我已经尝试了SendKeys、SendInput、keybd_event和Post_Message等方法,但都无法将它们传递给像Burnout Paradise这样的游戏。
我知道GlovePIE输入能够传递给游戏,但是如何实现呢?目前我的解决办法是通过在我的WPF应用程序中使用PPJoy,它有C++示例代码来模拟按钮按下事件。我通过[DLLImport]从WPF app调用此代码。然后我在GlovePIE中捕获游戏手柄按钮按下事件,并将其转换为键盘按键。这种方法可以正常工作,但是PPJoys驱动程序未经签名,所以我不能共享此代码,因为人们需要允许测试签名的驱动程序。
有没有人知道GlovePIE如何模拟按键事件?我已经在GlovePIE论坛上发帖,但没有回复。GlovePIE有一点“黑科技”可以与旧版的openNI kinect驱动程序配合使用,但我正在使用最近发布的标准微软版本。
3个回答

1

好的,不确定回答自己的问题有什么规定,但我找到了整个正确的解决方案,并想分享作为已勾选的答案。

首先,包含此使用语句。

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)使用扫描码。我的问题是我错误地使用了扫描码,因此对于某些游戏无法工作。建议您如果不知道应用程序想要使用哪个,请调用两次,一次使用虚拟键,一次使用 Direct Input Key。

这是一个关于字母 'A' 的示例,使用虚拟键和 Direct Input Keys 进行两次调用。

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

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

你可以看到,从VK到DIK的A值是不同的。这两个链接都涉及到十六进制值,而我上面的示例显示的是十进制(整数)。

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

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

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


0

抱歉,我不知道GlovePIE,但也许这些可以帮到你。

当模拟按键时,PostMessage和SendMessage会有不同的行为。同时,了解你实际发送的消息是什么,如keydown/up、keypress等,也会有所帮助。

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

同样,如果你正在模拟鼠标点击,还可以检查鼠标位置以确保它仍在可点击区域内。

考虑到长按某个键会触发重复机制,发送多个按键消息,通常在游戏中,你长按某个键不仅仅是单击一次。


我使用睡眠然后发送keyup命令来“按住”键。在记事本中一切都很好,我也不想指定我要发送按键的窗口/子窗口。因此,我不能使其与游戏/应用程序无关。感谢您提供的一些想法。 - Maz
根据某些变量,应用程序可能期望更多的按键事件,需要一些时间 - 或者忽略它并使用其他东西,例如查看多个“wm_char”消息。:: SendMessage(hWND,WM_KEYDOWN,VK_RETURN,0); :: SendMessage(hWND,WM_CHAR,VK_RETURN,0); :: SendMessage(hWND,WM_CHAR,VK_RETURN,0); :: SendMessage(hWND,WM_KEYUP,VK_RETURN,0); - Greg Domjan

0

虽然我不会说这是最好的答案,但我想回顾一下我正在使用的解决方案。我发现我可以使用vJoy http://headsoft.com.au/index.php?category=vjoy,它已经签名,因此可以在Windows 7 64位中使用。我可以调用外部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以读取我通过keybd_event发送的“c”或其他键。 vJoy正确读取此内容,然后“按下”GlovePIE捕获的相关按钮。 因此,在GlovePIE中,我的脚本如下:

A = joystick1.Button1
Z = joystick1.Button2

在我尝试过的游戏中都能正常工作。 虽然不是最理想的方案,但它可以让最终用户通过vJoy和GlovePIE自定义输入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接