C#在游戏应用程序中按住键

时间:2013-05-02 15:59:35

标签: c# key fullscreen keyup

我正在尝试创建一个C#应用程序,它将控制游戏。我试图做的是例如:按住A键150ms,按住左箭头500ms,依此类推。 我经常搜索,我发现了以下代码。我的程序首先瞄准游戏,然后拿着钥匙。

I'm holding the keys this way:

Keyboard.HoldKey(Keys.Left);
Thread.sleep(500);
Keyboard.ReleaseKey(Keys.Left);

这是Keyboard类:

public class Keyboard
 {
    public Keyboard()
    {
    }

    [StructLayout(LayoutKind.Explicit, Size = 28)]
    public struct Input
    {
        [FieldOffset(0)]
        public uint type;
        [FieldOffset(4)]
        public KeyboardInput ki;
    }

    public struct KeyboardInput
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public long time;
        public uint dwExtraInfo;
    }

    const int KEYEVENTF_KEYUP = 0x0002;
    const int INPUT_KEYBOARD = 1;

    [DllImport("user32.dll")]
    public static extern int SendInput(uint cInputs, ref Input inputs, int cbSize);

    [DllImport("user32.dll")]
    static extern short GetKeyState(int nVirtKey);

    [DllImport("user32.dll")]
    static extern ushort MapVirtualKey(int wCode, int wMapType);


    public static bool IsKeyDown(Keys key)
    {
        return (GetKeyState((int)key) & -128) == -128;
    }

    public static void HoldKey(Keys vk)
    {
        ushort nScan = MapVirtualKey((ushort)vk, 0);

        Input input = new Input();
        input.type = INPUT_KEYBOARD;
        input.ki.wVk = (ushort)vk;
        input.ki.wScan = nScan;
        input.ki.dwFlags = 0;
        input.ki.time = 0;
        input.ki.dwExtraInfo = 0;
        SendInput(1, ref input, Marshal.SizeOf(input)).ToString();
    }

    public static void ReleaseKey(Keys vk)
    {
        ushort nScan = MapVirtualKey((ushort)vk, 0);

        Input input = new Input();
        input.type = INPUT_KEYBOARD;
        input.ki.wVk = (ushort)vk;
        input.ki.wScan = nScan;
        input.ki.dwFlags = KEYEVENTF_KEYUP;
        input.ki.time = 0;
        input.ki.dwExtraInfo = 0;
        SendInput(1, ref input, Marshal.SizeOf(input));
    }

    public static void PressKey(Keys vk)
    {
        HoldKey(vk);
        ReleaseKey(vk);
    }
}

并且它在记事本/浏览器等工作,但它不适用于任何游戏,无论是全屏还是窗口模式。 你能帮我弄清楚如何在全屏应用/游戏中按键吗? 谢谢!

3 个答案:

答案 0 :(得分:3)

“按住A键150ms,按住左箭头500ms”

看看是否有效:

        Keyboard.HoldKey((byte)Keys.A, 150);
        Keyboard.HoldKey((byte)Keys.Left, 500);

使用:

public class Keyboard
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

    const int KEY_DOWN_EVENT = 0x0001; //Key down flag
    const int KEY_UP_EVENT = 0x0002; //Key up flag

    public static void HoldKey(byte key, int duration)
    {
        int totalDuration = 0;
        while (totalDuration < duration)
        {
            keybd_event(key, 0, KEY_DOWN_EVENT, 0);
            keybd_event(key, 0, KEY_UP_EVENT, 0);
            System.Threading.Thread.Sleep(PauseBetweenStrokes);
            totalDuration += PauseBetweenStrokes;
        }
    }
}

答案 1 :(得分:0)

我使用Windown API和SendInput方法完成了它。

答案 2 :(得分:0)

你可以使用它,这非常适合按住键:

    public class Keyboard
{

    const int PauseBetweenStrokes = 50;
    [DllImport("user32.dll", SetLastError = true)]
    static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

    const int KEY_DOWN_EVENT = 0x0001; //Key down flag
    const int KEY_UP_EVENT = 0x0002; //Key up flag

    public static void HoldKey(byte key, int duration)
    {
        keybd_event(key, 0, KEY_DOWN_EVENT, 0);
        System.Threading.Thread.Sleep(duration);
        keybd_event(key, 0, KEY_UP_EVENT, 0);
    }
}