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

我正在尝试创建一个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); } } 

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

“按住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; } } } 

我使用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); } }