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