0

DirectX ゲームでボタンを提供するために Winform を使用しています。したがって、私はこのクラスを使用しています:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

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

        [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;
        }

        [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;
        }

        const int KEYEVENTF_EXTENDEDKEY = 0x0001;
        const int KEYEVENTF_KEYUP = 0x0002;
        const int KEYEVENTF_UNICODE = 0x0004;
        const int KEYEVENTF_SCANCODE = 0x0008;


        public void Send_Key(short Keycode, int KeyUporDown)
        {
            INPUT[] InputData = new INPUT[1];

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

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

    }
}

次に、これでボタンを送信しています:

DirectInput.cDirectInput d = new DirectInput.cDirectInput();
d.Send_Key(0x11, 0x0008);

しかし、私がそれを送ったとき、それは永続的です。w を送信すると、プレイヤーは永遠に前進します。キーボードの w を押すと停止できます。止まらないのはなぜ?エディターに送信すると、送信を停止すると停止しますが、ゲーム内では停止しません。何が問題ですか?前もって感謝します!

4

1 に答える 1

2

キー ダウン メッセージを送信していますが、それに続くキー アップ メッセージを送信していません。ドキュメントから:

KEYBDINPUT.dwFlags:

  • KEYEVENTF_KEYUP (0x0002)
    指定されている場合、キーが解放されています。指定されていない場合は、キーが押されています。

1 秒間進むには、次を試してください。

d.Send_Key(0x11, 0x0008);
Thread.Sleep(1000);
d.Send_Key(0x11, 0x000A);

キーを押すと問題が修正される理由wは、keydown イベント (無視される) が送信され、次に keyup イベントが送信され、最後にキーが解放されることに注意してください。

于 2012-11-10T16:19:40.193 に答える