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

C#在游戏应用程序中按住键,c#,key,fullscreen,keyup,C#,Key,Fullscreen,Keyup,我正在尝试制作一个C#应用程序,它将控制一个游戏。我试着做的是:按住A键150毫秒,按住左箭头500毫秒等等。 我搜索了很多,发现了下面的代码。我的程序首先瞄准游戏,然后按住键 I'm holding the keys this way: Keyboard.HoldKey(Keys.Left); Thread.sleep(500); Keyboard.ReleaseKey(Keys.Left); 以下是键盘类: public class Keyboard { public Keyb

我正在尝试制作一个C#应用程序,它将控制一个游戏。我试着做的是:按住A键150毫秒,按住左箭头500毫秒等等。 我搜索了很多,发现了下面的代码。我的程序首先瞄准游戏,然后按住键

I'm holding the keys this way:

Keyboard.HoldKey(Keys.Left);
Thread.sleep(500);
Keyboard.ReleaseKey(Keys.Left);
以下是键盘类:

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);
    }
}
它可以在记事本/浏览器等环境下工作,但在任何游戏中都不能工作,无论是全屏模式还是窗口模式。 你能帮我弄清楚如何在全屏应用程序/游戏中按住按键吗? 谢谢

按住A键150毫秒,按住左箭头500毫秒

看看这是否有效:

        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;
        }
    }
}
公共类键盘
{
[DllImport(“user32.dll”,SetLastError=true)]
静态外部无效keybd_事件(字节bVk、字节bScan、int-dwFlags、int-dwExtraInfo);
const int KEY_DOWN_事件=0x0001;//KEY DOWN标志
const int KEY_UP_事件=0x0002;//KEY UP标志
公共静态void保持键(字节键,int持续时间)
{
int totalDuration=0;
while(总持续时间<持续时间)
{
keybd_事件(键,0,键向下_事件,0);
keybd_事件(key,0,key,UP_事件,0);
系统。线程。线程。睡眠(两次行程之间的暂停);
总持续时间+=两次行程之间的暂停;
}
}
}

我是用Windown API和SendInput方法实现的。

您可以让它使用它,这对于按住键非常有用:

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

你不能仅仅用谷歌搜索一段代码,将其转储到应用程序中,然后期望它能工作。定义
不工作
?这是一个非常宽泛的术语,到底是什么不起作用?游戏通常通过DirectX获得键盘,这是一种非常不同的处理方式。将Windows输入消息发送到此类应用程序是没有用的。[PDF]。其他的都是我自己做的,只是我不习惯windows API。我所说的不工作是指我的应用程序瞄准了游戏,并试图保持/释放箭游戏,但在我身上什么都没有发生。如果我按下键盘上的箭头,它就会工作。@GSerg你能给我一个小例子,我应该怎么做?你好。感谢您的回答,但遗憾的是,效果与我第一篇文章中的代码相同:它在记事本/浏览器等中工作,但在游戏窗口中不工作。我将HoldKey()更改为快速按下/释放键,直到达到持续时间。看看效果是否更好…还是一样,似乎游戏以不同的方式处理按键:(只是注意到我没有包括“PauseBetweenStrokes”:
const int PauseBetweenStrokes=50;
我认为这不会有多大区别。很抱歉,它没有起作用…祝你好运!是的,我试过1、10和20:(似乎不是每个游戏都能处理这样的操作。你能解释一下你的意思吗?