Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 像GlovePIE一样伪造输入_C#_C++_Wpf_Kinect - Fatal编程技术网

C# 像GlovePIE一样伪造输入

C# 像GlovePIE一样伪造输入,c#,c++,wpf,kinect,C#,C++,Wpf,Kinect,我一直在对Kinect编程,现在我想让游戏对我在Kinect上所做的事情做出反应。将数据发送到记事本以便按键是非常容易的,但将其发送到游戏中要困难得多 首先,我一直在使用Kinect中的WPF骨架示例,并在此基础上进行构建。我可以使用C++版本,但是我的C++非常生锈,我宁愿不要。p> 这就是我到目前为止所做的,我尝试了SendKeys,SendInput,keybd\u event,Post\u Message。没有一个能像《精疲力竭天堂》这样进入游戏 我知道格洛维派的输入会进入游戏,但如何?

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

首先,我一直在使用Kinect中的WPF骨架示例,并在此基础上进行构建。我可以使用C++版本,但是我的C++非常生锈,我宁愿不要。p> 这就是我到目前为止所做的,我尝试了
SendKeys
SendInput
keybd\u event
Post\u Message
。没有一个能像《精疲力竭天堂》这样进入游戏

我知道格洛维派的输入会进入游戏,但如何?目前我的工作围绕/HACK,是使用PPJOY,它有C++中的示例代码来模拟按钮按下。我从WPF应用程序中通过[DllImport]调用此功能。然后,我拿起GlovePIE中的操纵杆按钮,让它将其转换为键盘键。所以我绕了一圈,这是可行的,但是PPJoys驱动程序没有签名,所以我不能真正分享这段代码,因为人们必须允许测试签名的驱动程序


有人知道GlovePIE是如何实现按键的吗?我已经在GlovePIE论坛上发布了帖子,但没有回复。GlovePIE在使用老的openNI kinect驱动程序方面有点小技巧,但我使用的是几周前发布的标准microsoft版本。

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

PostMessage和SendMessage在处理模拟击键时获得不同的行为。 也有助于了解您实际发送的信息,如向下键/向上键、按键等

您可能需要更改焦点,可能选择了错误的元素,或者发送到错误的(子)窗口

类似地,如果您模拟鼠标单击的位置,还可以检查鼠标的位置,以确保它仍然位于可单击区域上


还可以考虑按下一个键触发一个重复机制,发送多个键信息,通常在游戏中,你按下一个键来打开,而不仅仅是点击一次。

虽然我不会说这是最好的答案,但我想用我正在使用的解决方案来回击。我发现我可以使用签名的vJoy,因此它可以在Windows7 64位中使用。我可以调用这个外部keybd\u事件

[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\u事件(CKEY、SCANCODE、KEYDOWN、0)然后X帧稍后调用
Keybd_事件(CKEY,扫描代码,KEYUP,0)

我将vJoy设置为读取“c”或通过keybd_事件发送的其他键。vJoy正确阅读此内容,然后“按下”GlovePIE拾取的相关按钮。所以在GlovePIE中我的脚本看起来像

A = joystick1.Button1
Z = joystick1.Button2
这在我尝试过的游戏中起作用。
这肯定不是什么好主意,但它可以工作,并允许最终用户通过vJoy和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,而一些(Direct X aka DIKey)使用扫描码。我的问题是我使用的扫描代码不正确,所以它不适用于某些游戏。我建议,如果您不知道什么应用程序想要使用这些,您可以调用它两次,一次使用虚拟键,另一次使用直接输入键

下面是两个使用虚拟键然后使用直接输入键调用字母“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之间是不同的 这两个链接都与十六进制值有关,而我上面的示例显示的是基数10(整数)

VKeys链接

戴克斯链


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

我已通过使用睡眠“按住”键,然后发送keyup命令。记事本中的一切都很好,我也不想指定我发送击键的窗口/子窗口。所以我不能让它与游戏/应用程序无关。不过,谢谢你的一些想法。根据不同的情况,一个应用程序可能会期待更多的东西,而不仅仅是需要一些时间来启动,或者忽略这一点,然后使用其他东西,例如查看多条“wm_char”消息`::发送消息(hWND,WM_键下,VK_返回,0);::SendMessage(hWND,WM_CHAR,VK_RETURN,0);::SendMessage(hWND,WM_CHAR,VK_RETURN,0);::SendMessage(hWND,WM_键控,VK_返回,0)`