我正在尝试为自定义游戏控制器应用程序模拟键盘命令.因为我需要在DirectInput环境中模拟命令,所以大多数常用方法都不起作用.我知道使用一个钩子可以100%工作,但我试图找到一个更容易的实现.
我已经做了很多搜索,发现通过使用带有扫描码的SendInput API而不是虚拟键应该可以工作,但它似乎表现得像键是"坚持".我已经发送了KEYDOWN和KEYUP事件,但是当我尝试在DirectInput环境中发送消息时,游戏就像按下键一样.
例如,如果我模拟"W"按键并将该键映射到第一人称射击游戏中以"向前移动"动作,那么一旦我在游戏中,下面的功能将导致角色向前移动.但是,只需发出一次命令,它就会无限地向前移动角色.
这是我正在调用的SendInput函数的代码片段(在C#中):
[DllImport("user32.dll")]
static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);
public static void Test_KeyDown()
{
INPUT[] InputData = new INPUT[2];
Key ScanCode = Microsoft.DirectX.DirectInput.Key.W;
InputData[0].type = 1; //INPUT_KEYBOARD
InputData[0].wScan = (ushort)ScanCode;
InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;
InputData[1].type = 1; //INPUT_KEYBOARD
InputData[1].wScan = (ushort)ScanCode;
InputData[1].dwFlags = (uint)(SendInputFlags.KEYEVENTF_KEYUP | SendInputFlags.KEYEVENTF_UNICODE);
// send keydown
if (SendInput(2, InputData, Marshal.SizeOf(InputData[1])) == 0)
{
System.Diagnostics.Debug.WriteLine("SendInput failed with code: " +
Marshal.GetLastWin32Error().ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定这种方法是否是一个失败的原因,或者是否有一些愚蠢的东西我不知道.如果我不需要使用钩子,我讨厌使代码复杂化,但这对我来说也是一个新的领域.
任何人都可以给予任何帮助非常感谢.
谢谢!
我正在研究C++ DirectX 2D游戏,我需要键盘和鼠标输入.
维基百科说:
Microsoft建议新应用程序使用Windows消息循环进行键盘和鼠标输入,而不是DirectInput
那我该怎么用呢?
我有一个GameScreen类,它负责绘图和更新(游戏逻辑),我在Windows消息循环中调用Draw和Update方法.
谢谢
很多游戏都在使用x360控制器,但没有正确映射到PS3 DS3控制器......
MotionInJoy使用"模拟360控制器"进行清理,但它仅适用于PC.还有另一个仅限PC的项目:x360ce:https://code.google.com/p/x360ce/
这是一个问题:mac os x有什么解决方案吗?如果没有,为什么!
我正在构建一个需要在系统范围内过滤鼠标点击的应用程序.也就是说,我需要在特殊情况下让系统忽略一些鼠标按钮点击.
我使用低级鼠标钩并SetWindowsHookEx过滤掉这些点击.除WPF应用程序外,它的工作相对较好.我想这是因为这些应用程序使用DirectX和DirectInput进行输入处理,这就是为什么我不能过滤掉这些应用程序中的点击,因为它们直接从驱动程序获得输入.
有没有办法过滤WPF/ DirectX应用程序中的点击?
我知道全局过滤点击通常不是一个好主意,但它对我的应用程序至关重要,我会确保它不会在游戏和其他程序中过滤.但是WPF应用程序很普通GUI,所以我也需要过滤它们中的点击.
我想我可以通过编写自己的过滤驱动程序来解决这个问题,但由于我没有编写驱动程序的经验,如果有任何其他解决方案,请告诉我.
我找到了一些有关API挂钩的有用链接.使用此作为参考.
挂钩Windows API
API挂钩透露
API挂钩透露第2部分
劫持Textout调用记事本
madCodeHook
IAT功能挂钩
WPF不使用DirectInput,而是使用标准的Win32消息进行输入处理(除了手写笔,这是我所有问题的根源,因为我使用手写笔进行开发,我不知道WPF应用是手写笔感知的).但是,对于使用DirectInput的应用程序中的点击过滤,必须挂钩API,正如接受的答案所解释的那样.
我希望我的python程序模拟XBox控制器输入.如果可能,两个模拟拇指杆和开/关按钮.
我在python中找到了关于使用ctypes模拟键盘输入的主题,例如: Python模拟keydown
是否可以模拟它类似于普通键盘或鼠标上的"keydown"?
我有一个C++程序,它在程序开始时枚举所有输入设备(使用直接输入).如果程序启动,然后我插入另一个控制器,则在重新启动程序之前将无法识别该控制器.任何人都知道我可以使用的事件会导致我的程序在插入新设备后枚举所有设备吗?
我正在尝试模拟游戏中的鼠标事件.游戏使用DirectInput,因此您无法使用SendMessage向其发送鼠标事件/键盘事件,这基本上就是我必须加入游戏的原因.
另外我不想使用SendInput/mouse_events,游戏必须在后台运行并制作鼠标事件.
我已经设法在游戏中创建一个DLL钩子,但现在下一个问题是我必须制作鼠标事件和键盘(可能是主要问题).
提前致谢.
对不起,如果我的问题似乎有点小,但我找不到答案.我想在我的XNA游戏中使用DirectInput.我已经阅读过,似乎这是从XBox 360控制器以外的游戏手柄获取输入的最佳方式.第一步是包含Microsoft.DirectX.DirectInput命名空间,但我不太清楚如何.简单地将它放在我班级的开头不起作用,Visual C#无法识别它.
这让我想到我应该下载DirectX SDK吗?那里有很多东西,文件很大我怎么才下载单个命名空间?这甚至可能吗?如果我可以下载单个命名空间,我在哪里放置文件?
现在你可以看到我脑子里的所有问题.那么如何让visual C#识别出Microsoft.DirectX.DirectInput命名空间,这样我才能使用方法,属性和所有好东西?
谢谢!
我需要一些关于DirectInput的帮助,我会告诉我想要做什么.当我只按一个键时,我想让我的程序向游戏发送键组合.例子:我将按"r",它将按"1","3","2","4"键.我从这里找到了一些代码.但他们并没有完全奏效.
public static void Send_Key_Hold(short Keycode)
{
INPUT[] InputData = new INPUT[1];
InputData[0].type = 1;
InputData[0].ki.wScan = Keycode;
InputData[0].ki.dwFlags = (int)(KEYEVENTF_SCANCODE);
SendInput(1, InputData, Marshal.SizeOf(InputData[0]));
}
public static void Send_Key_Release(short Keycode)
{
INPUT[] InputData = new INPUT[1];
InputData[0].type = 1;
InputData[0].ki.wScan = Keycode;
InputData[0].ki.dwFlags = (int)(KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE);
SendInput(1, InputData, Marshal.SizeOf(InputData[0]));
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码和我的问题:当我使用Send_Key_Hold时,它只按下游戏中的一个键并且没有按下其他组合键,因为我认为第一个键是持久的.当我一起使用Send_Key_Hold和Send_Key_Release时,它不会按下游戏上的任何按钮.但在桌面上(我的意思是任何其他应用程序而不是游戏)它按下键.
我是直接输入的新手。我设法将方向盘初始化为DI8DEVCLASS_GAMECTRL设备并获取所有数据。现在踏板有点麻烦,因为它们共享一个轴(加速是 Y 轴正值,刹车是 Y 轴负值,意味着如果两者都按下,则值为 0)
我如何通过以下方式以良好的方式访问以下值DirectInput?
DIAXIS_DRIVINGR_STEERDIAXIS_DRIVINGR_ACCELERATEDIAXIS_DRIVINGR_BRAKE