C# c向directx应用程序发送按键

C# c向directx应用程序发送按键,c#,C#,我正在开发一个小应用程序,它向directx应用程序发送3个返回键。但我有一个错误,因为在directx应用程序中,只有第一个返回键起作用。我在记事本中进行了测试,结果很好。我不知道为什么 请帮帮我。非常感谢 private int Itournament; private int FLAG = 0x0008; [DllImport("user32.dll")] static extern UInt32 SendInput(UIn

我正在开发一个小应用程序,它向directx应用程序发送3个返回键。但我有一个错误,因为在directx应用程序中,只有第一个返回键起作用。我在记事本中进行了测试,结果很好。我不知道为什么

请帮帮我。非常感谢

        private int Itournament;
        private int FLAG = 0x0008;

        [DllImport("user32.dll")]
        static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);

        [StructLayout(LayoutKind.Explicit)]
        struct INPUT
        {
            [FieldOffset(0)]
            public int type;
            [FieldOffset(4)]
            public MOUSEINPUT mi;
            [FieldOffset(4)]
            public KEYBDINPUT ki;
            [FieldOffset(4)]
            public HARDWAREINPUT hi;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct MOUSEINPUT
        {
            public int dx;
            public int dy;
            public int mouseData;
            public int dwFlags;
            public int time;
            public IntPtr dwExtraInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct KEYBDINPUT
        {
            public short wVk;
            public short wScan;
            public int dwFlags;
            public int time;
            public IntPtr dwExtraInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct HARDWAREINPUT
        {
            public int uMsg;
            public short wParamL;
            public short wParamH;
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Itournament = Convert.ToInt32(textBox1.Text);
            panel1.Enabled = false;
            button2.Enabled = true;
            Droid(Itournament);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Application.Restart();
        }

        private void Droid(int Itournament_)
        {
            Thread.Sleep(5000);
            Send_Key(0x1C);
            Thread.Sleep(5000);
            Send_Key(0x1C);            

            /*do
            {
                Send_Key(0x14);
                Itournament_--;
            }
            while (Itournament_ != 0);*/
        }

        private void Send_Key(short Keycode)
        {
            INPUT[] InputData = new INPUT[1];

            InputData[0].type = 1;
            InputData[0].ki.wScan = Keycode;
            InputData[0].ki.dwFlags = FLAG;
            InputData[0].ki.time = 0;
            InputData[0].ki.dwExtraInfo = IntPtr.Zero;

            SendInput(1, InputData, Marshal.SizeOf(typeof(INPUT)));
        }

该标志设置为扫描代码。其他一切看起来都是正确的。这是我的枚举

[Flags]
public enum KeyFlag
{       
    KeyDown = 0x0000,
    ExtendedKey = 0x0001,
    KeyUp = 0x0002,
    UniCode = 0x0004,
    ScanCode = 0x0008
}
尝试发送带有扫描码作为标志值的向下键0x0000

例如:KeyFlag.KeyDown | KeyFlag.ScanCode


记得使用KeyFlag.KeyUp | KeyFlag.ScanCode发送另一个SendInput以模拟按键并释放向下键。

我尝试了此解决方案,但发现了问题所在…我无法发送我曾经使用过的按键…您应该能够发送,但您还必须发送另一条消息KeyUp以模拟按键。