相关疑难解决方法(0)

在DirectInput应用程序中使用SendInput API模拟键盘

我正在尝试为自定义游戏控制器应用程序模拟键盘命令.因为我需要在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# directinput sendinput

16
推荐指数
1
解决办法
4万
查看次数

模拟输入:按键按下、保持和释放

我试图模拟用户按下一个键,按住它某个特定的时间间隔,然后释放它。我曾尝试使用 来实现这一点SendKeys.Send(),但我无法弄清楚如何控制按键被按下的持续时间。

我不想一遍又一遍地发送相同的密钥;我想要一个按键按下和一个按键按下事件。

例如,我有这样的代码:

//when i press this button, will sent keyboard key "A", i want to hold it until i release

private void start_btn_Click(object sender, EventArgs e)
{
    testSent();
}

//how should i hold it for a timer???
private void testSent()
{
    SendKeys.Send("A");
}
Run Code Online (Sandbox Code Playgroud)

c# keypress sendkeys

5
推荐指数
1
解决办法
5249
查看次数

标签 统计

c# ×2

directinput ×1

keypress ×1

sendinput ×1

sendkeys ×1