在 C# 中模拟键盘输入
Posted
技术标签:
【中文标题】在 C# 中模拟键盘输入【英文标题】:Simulate keyboard input in C# 【发布时间】:2013-12-27 06:05:32 【问题描述】:我需要知道如何模拟键 W
、S
、A
、D
的键盘输入。
我使用了SendKeys
无济于事,也使用了InputSimulator
库但没有修复。
我想要做的是让游戏(战地、自然选择等较新的 FPS 游戏)等应用程序将这些模拟键注册为真正的击键。我正在尝试制作一个虚拟控制器程序,其中外部控件将注册为这些游戏的键盘输入。
有没有办法像这样手动模拟键盘输入?
[DllImport("user32.dll",
CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(uint dwFlags,
uint dx,
uint dy,
int cButtons,
uint dwExtraInfo);
【问题讨论】:
显示您使用的发送密钥语法 您到底为什么要使用 mouse_event 模拟键盘输入? 我不想使用 mouse_event 我说的是类似的东西,它会向计算机发送消息以模拟按下的按钮。我使用的键语法只是 Sendkeys.sendwait("W");这在游戏中不起作用。 【参考方案1】:您是否尝试过使用取代keybd_event
的SendInput
?
要从 C# 调用 SendInput,您将需要创建一大堆结构。幸运的是,大部分信息都可以从pinvoke.net 收集到。
查看SendInput 和INPUT 结构的pinvoke 文档,我想到了以下内容。我在顶部编写的名为 SendInputWithAPI 的方法是调用 SendInput 来模拟“wsad”的发送。其余代码只是使其工作所需的结构声明。
void SendInputWithAPI()
INPUT[] Inputs = new INPUT[4];
INPUT Input = new INPUT();
Input.type = 1; // 1 = Keyboard Input
Input.U.ki.wScan = ScanCodeShort.KEY_W;
Input.U.ki.dwFlags = KEYEVENTF.SCANCODE;
Inputs[0] = Input;
Input.type = 1; // 1 = Keyboard Input
Input.U.ki.wScan = ScanCodeShort.KEY_S;
Input.U.ki.dwFlags = KEYEVENTF.SCANCODE;
Inputs[1] = Input;
Input.type = 1; // 1 = Keyboard Input
Input.U.ki.wScan = ScanCodeShort.KEY_A;
Input.U.ki.dwFlags = KEYEVENTF.SCANCODE;
Inputs[2] = Input;
Input.type = 1; // 1 = Keyboard Input
Input.U.ki.wScan = ScanCodeShort.KEY_D;
Input.U.ki.dwFlags = KEYEVENTF.SCANCODE;
Inputs[3] = Input;
SendInput(4, Inputs, INPUT.Size);
/// <summary>
/// Declaration of external SendInput method
/// </summary>
[DllImport("user32.dll")]
internal static extern uint SendInput(
uint nInputs,
[MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
int cbSize);
// Declare the INPUT struct
[StructLayout(LayoutKind.Sequential)]
public struct INPUT
internal uint type;
internal InputUnion U;
internal static int Size
get return Marshal.SizeOf(typeof(INPUT));
// Declare the InputUnion struct
[StructLayout(LayoutKind.Explicit)]
internal struct InputUnion
[FieldOffset(0)]
internal MOUSEINPUT mi;
[FieldOffset(0)]
internal KEYBDINPUT ki;
[FieldOffset(0)]
internal HARDWAREINPUT hi;
[StructLayout(LayoutKind.Sequential)]
internal struct MOUSEINPUT
internal int dx;
internal int dy;
internal MouseEventDataXButtons mouseData;
internal MOUSEEVENTF dwFlags;
internal uint time;
internal UIntPtr dwExtraInfo;
[Flags]
internal enum MouseEventDataXButtons : uint
Nothing = 0x00000000,
XBUTTON1 = 0x00000001,
XBUTTON2 = 0x00000002
[Flags]
internal enum MOUSEEVENTF : uint
ABSOLUTE = 0x8000,
HWHEEL = 0x01000,
MOVE = 0x0001,
MOVE_NOCOALESCE = 0x2000,
LEFTDOWN = 0x0002,
LEFTUP = 0x0004,
RIGHTDOWN = 0x0008,
RIGHTUP = 0x0010,
MIDDLEDOWN = 0x0020,
MIDDLEUP = 0x0040,
VIRTUALDESK = 0x4000,
WHEEL = 0x0800,
XDOWN = 0x0080,
XUP = 0x0100
[StructLayout(LayoutKind.Sequential)]
internal struct KEYBDINPUT
internal VirtualKeyShort wVk;
internal ScanCodeShort wScan;
internal KEYEVENTF dwFlags;
internal int time;
internal UIntPtr dwExtraInfo;
[Flags]
internal enum KEYEVENTF : uint
EXTENDEDKEY = 0x0001,
KEYUP = 0x0002,
SCANCODE = 0x0008,
UNICODE = 0x0004
internal enum VirtualKeyShort : short
///<summary>
///Left mouse button
///</summary>
LBUTTON = 0x01,
///<summary>
///Right mouse button
///</summary>
RBUTTON = 0x02,
///<summary>
///Control-break processing
///</summary>
CANCEL = 0x03,
///<summary>
///Middle mouse button (three-button mouse)
///</summary>
MBUTTON = 0x04,
///<summary>
///Windows 2000/XP: X1 mouse button
///</summary>
XBUTTON1 = 0x05,
///<summary>
///Windows 2000/XP: X2 mouse button
///</summary>
XBUTTON2 = 0x06,
///<summary>
///BACKSPACE key
///</summary>
BACK = 0x08,
///<summary>
///TAB key
///</summary>
TAB = 0x09,
///<summary>
///CLEAR key
///</summary>
CLEAR = 0x0C,
///<summary>
///ENTER key
///</summary>
RETURN = 0x0D,
///<summary>
///SHIFT key
///</summary>
SHIFT = 0x10,
///<summary>
///CTRL key
///</summary>
CONTROL = 0x11,
///<summary>
///ALT key
///</summary>
MENU = 0x12,
///<summary>
///PAUSE key
///</summary>
PAUSE = 0x13,
///<summary>
///CAPS LOCK key
///</summary>
CAPITAL = 0x14,
///<summary>
///Input Method Editor (IME) Kana mode
///</summary>
KANA = 0x15,
///<summary>
///IME Hangul mode
///</summary>
HANGUL = 0x15,
///<summary>
///IME Junja mode
///</summary>
JUNJA = 0x17,
///<summary>
///IME final mode
///</summary>
FINAL = 0x18,
///<summary>
///IME Hanja mode
///</summary>
HANJA = 0x19,
///<summary>
///IME Kanji mode
///</summary>
KANJI = 0x19,
///<summary>
///ESC key
///</summary>
ESCAPE = 0x1B,
///<summary>
///IME convert
///</summary>
CONVERT = 0x1C,
///<summary>
///IME nonconvert
///</summary>
NONCONVERT = 0x1D,
///<summary>
///IME accept
///</summary>
ACCEPT = 0x1E,
///<summary>
///IME mode change request
///</summary>
MODECHANGE = 0x1F,
///<summary>
///SPACEBAR
///</summary>
SPACE = 0x20,
///<summary>
///PAGE UP key
///</summary>
PRIOR = 0x21,
///<summary>
///PAGE DOWN key
///</summary>
NEXT = 0x22,
///<summary>
///END key
///</summary>
END = 0x23,
///<summary>
///HOME key
///</summary>
HOME = 0x24,
///<summary>
///LEFT ARROW key
///</summary>
LEFT = 0x25,
///<summary>
///UP ARROW key
///</summary>
UP = 0x26,
///<summary>
///RIGHT ARROW key
///</summary>
RIGHT = 0x27,
///<summary>
///DOWN ARROW key
///</summary>
DOWN = 0x28,
///<summary>
///SELECT key
///</summary>
SELECT = 0x29,
///<summary>
///PRINT key
///</summary>
PRINT = 0x2A,
///<summary>
///EXECUTE key
///</summary>
EXECUTE = 0x2B,
///<summary>
///PRINT SCREEN key
///</summary>
SNAPSHOT = 0x2C,
///<summary>
///INS key
///</summary>
INSERT = 0x2D,
///<summary>
///DEL key
///</summary>
DELETE = 0x2E,
///<summary>
///HELP key
///</summary>
HELP = 0x2F,
///<summary>
///0 key
///</summary>
KEY_0 = 0x30,
///<summary>
///1 key
///</summary>
KEY_1 = 0x31,
///<summary>
///2 key
///</summary>
KEY_2 = 0x32,
///<summary>
///3 key
///</summary>
KEY_3 = 0x33,
///<summary>
///4 key
///</summary>
KEY_4 = 0x34,
///<summary>
///5 key
///</summary>
KEY_5 = 0x35,
///<summary>
///6 key
///</summary>
KEY_6 = 0x36,
///<summary>
///7 key
///</summary>
KEY_7 = 0x37,
///<summary>
///8 key
///</summary>
KEY_8 = 0x38,
///<summary>
///9 key
///</summary>
KEY_9 = 0x39,
///<summary>
///A key
///</summary>
KEY_A = 0x41,
///<summary>
///B key
///</summary>
KEY_B = 0x42,
///<summary>
///C key
///</summary>
KEY_C = 0x43,
///<summary>
///D key
///</summary>
KEY_D = 0x44,
///<summary>
///E key
///</summary>
KEY_E = 0x45,
///<summary>
///F key
///</summary>
KEY_F = 0x46,
///<summary>
///G key
///</summary>
KEY_G = 0x47,
///<summary>
///H key
///</summary>
KEY_H = 0x48,
///<summary>
///I key
///</summary>
KEY_I = 0x49,
///<summary>
///J key
///</summary>
KEY_J = 0x4A,
///<summary>
///K key
///</summary>
KEY_K = 0x4B,
///<summary>
///L key
///</summary>
KEY_L = 0x4C,
///<summary>
///M key
///</summary>
KEY_M = 0x4D,
///<summary>
///N key
///</summary>
KEY_N = 0x4E,
///<summary>
///O key
///</summary>
KEY_O = 0x4F,
///<summary>
///P key
///</summary>
KEY_P = 0x50,
///<summary>
///Q key
///</summary>
KEY_Q = 0x51,
///<summary>
///R key
///</summary>
KEY_R = 0x52,
///<summary>
///S key
///</summary>
KEY_S = 0x53,
///<summary>
///T key
///</summary>
KEY_T = 0x54,
///<summary>
///U key
///</summary>
KEY_U = 0x55,
///<summary>
///V key
///</summary>
KEY_V = 0x56,
///<summary>
///W key
///</summary>
KEY_W = 0x57,
///<summary>
///X key
///</summary>
KEY_X = 0x58,
///<summary>
///Y key
///</summary>
KEY_Y = 0x59,
///<summary>
///Z key
///</summary>
KEY_Z = 0x5A,
///<summary>
///Left Windows key (Microsoft Natural keyboard)
///</summary>
LWIN = 0x5B,
///<summary>
///Right Windows key (Natural keyboard)
///</summary>
RWIN = 0x5C,
///<summary>
///Applications key (Natural keyboard)
///</summary>
APPS = 0x5D,
///<summary>
///Computer Sleep key
///</summary>
SLEEP = 0x5F,
///<summary>
///Numeric keypad 0 key
///</summary>
NUMPAD0 = 0x60,
///<summary>
///Numeric keypad 1 key
///</summary>
NUMPAD1 = 0x61,
///<summary>
///Numeric keypad 2 key
///</summary>
NUMPAD2 = 0x62,
///<summary>
///Numeric keypad 3 key
///</summary>
NUMPAD3 = 0x63,
///<summary>
///Numeric keypad 4 key
///</summary>
NUMPAD4 = 0x64,
///<summary>
///Numeric keypad 5 key
///</summary>
NUMPAD5 = 0x65,
///<summary>
///Numeric keypad 6 key
///</summary>
NUMPAD6 = 0x66,
///<summary>
///Numeric keypad 7 key
///</summary>
NUMPAD7 = 0x67,
///<summary>
///Numeric keypad 8 key
///</summary>
NUMPAD8 = 0x68,
///<summary>
///Numeric keypad 9 key
///</summary>
NUMPAD9 = 0x69,
///<summary>
///Multiply key
///</summary>
MULTIPLY = 0x6A,
///<summary>
///Add key
///</summary>
ADD = 0x6B,
///<summary>
///Separator key
///</summary>
SEPARATOR = 0x6C,
///<summary>
///Subtract key
///</summary>
SUBTRACT = 0x6D,
///<summary>
///Decimal key
///</summary>
DECIMAL = 0x6E,
///<summary>
///Divide key
///</summary>
DIVIDE = 0x6F,
///<summary>
///F1 key
///</summary>
F1 = 0x70,
///<summary>
///F2 key
///</summary>
F2 = 0x71,
///<summary>
///F3 key
///</summary>
F3 = 0x72,
///<summary>
///F4 key
///</summary>
F4 = 0x73,
///<summary>
///F5 key
///</summary>
F5 = 0x74,
///<summary>
///F6 key
///</summary>
F6 = 0x75,
///<summary>
///F7 key
///</summary>
F7 = 0x76,
///<summary>
///F8 key
///</summary>
F8 = 0x77,
///<summary>
///F9 key
///</summary>
F9 = 0x78,
///<summary>
///F10 key
///</summary>
F10 = 0x79,
///<summary>
///F11 key
///</summary>
F11 = 0x7A,
///<summary>
///F12 key
///</summary>
F12 = 0x7B,
///<summary>
///F13 key
///</summary>
F13 = 0x7C,
///<summary>
///F14 key
///</summary>
F14 = 0x7D,
///<summary>
///F15 key
///</summary>
F15 = 0x7E,
///<summary>
///F16 key
///</summary>
F16 = 0x7F,
///<summary>
///F17 key
///</summary>
F17 = 0x80,
///<summary>
///F18 key
///</summary>
F18 = 0x81,
///<summary>
///F19 key
///</summary>
F19 = 0x82,
///<summary>
///F20 key
///</summary>
F20 = 0x83,
///<summary>
///F21 key
///</summary>
F21 = 0x84,
///<summary>
///F22 key, (PPC only) Key used to lock device.
///</summary>
F22 = 0x85,
///<summary>
///F23 key
///</summary>
F23 = 0x86,
///<summary>
///F24 key
///</summary>
F24 = 0x87,
///<summary>
///NUM LOCK key
///</summary>
NUMLOCK = 0x90,
///<summary>
///SCROLL LOCK key
///</summary>
SCROLL = 0x91,
///<summary>
///Left SHIFT key
///</summary>
LSHIFT = 0xA0,
///<summary>
///Right SHIFT key
///</summary>
RSHIFT = 0xA1,
///<summary>
///Left CONTROL key
///</summary>
LCONTROL = 0xA2,
///<summary>
///Right CONTROL key
///</summary>
RCONTROL = 0xA3,
///<summary>
///Left MENU key
///</summary>
LMENU = 0xA4,
///<summary>
///Right MENU key
///</summary>
RMENU = 0xA5,
///<summary>
///Windows 2000/XP: Browser Back key
///</summary>
BROWSER_BACK = 0xA6,
///<summary>
///Windows 2000/XP: Browser Forward key
///</summary>
BROWSER_FORWARD = 0xA7,
///<summary>
///Windows 2000/XP: Browser Refresh key
///</summary>
BROWSER_REFRESH = 0xA8,
///<summary>
///Windows 2000/XP: Browser Stop key
///</summary>
BROWSER_STOP = 0xA9,
///<summary>
///Windows 2000/XP: Browser Search key
///</summary>
BROWSER_SEARCH = 0xAA,
///<summary>
///Windows 2000/XP: Browser Favorites key
///</summary>
BROWSER_FAVORITES = 0xAB,
///<summary>
///Windows 2000/XP: Browser Start and Home key
///</summary>
BROWSER_HOME = 0xAC,
///<summary>
///Windows 2000/XP: Volume Mute key
///</summary>
VOLUME_MUTE = 0xAD,
///<summary>
///Windows 2000/XP: Volume Down key
///</summary>
VOLUME_DOWN = 0xAE,
///<summary>
///Windows 2000/XP: Volume Up key
///</summary>
VOLUME_UP = 0xAF,
///<summary>
///Windows 2000/XP: Next Track key
///</summary>
MEDIA_NEXT_TRACK = 0xB0,
///<summary>
///Windows 2000/XP: Previous Track key
///</summary>
MEDIA_PREV_TRACK = 0xB1,
///<summary>
///Windows 2000/XP: Stop Media key
///</summary>
MEDIA_STOP = 0xB2,
///<summary>
///Windows 2000/XP: Play/Pause Media key
///</summary>
MEDIA_PLAY_PAUSE = 0xB3,
///<summary>
///Windows 2000/XP: Start Mail key
///</summary>
LAUNCH_MAIL = 0xB4,
///<summary>
///Windows 2000/XP: Select Media key
///</summary>
LAUNCH_MEDIA_SELECT = 0xB5,
///<summary>
///Windows 2000/XP: Start Application 1 key
///</summary>
LAUNCH_APP1 = 0xB6,
///<summary>
///Windows 2000/XP: Start Application 2 key
///</summary>
LAUNCH_APP2 = 0xB7,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_1 = 0xBA,
///<summary>
///Windows 2000/XP: For any country/region, the '+' key
///</summary>
OEM_PLUS = 0xBB,
///<summary>
///Windows 2000/XP: For any country/region, the ',' key
///</summary>
OEM_COMMA = 0xBC,
///<summary>
///Windows 2000/XP: For any country/region, the '-' key
///</summary>
OEM_MINUS = 0xBD,
///<summary>
///Windows 2000/XP: For any country/region, the '.' key
///</summary>
OEM_PERIOD = 0xBE,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_2 = 0xBF,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_3 = 0xC0,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_4 = 0xDB,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_5 = 0xDC,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_6 = 0xDD,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_7 = 0xDE,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_8 = 0xDF,
///<summary>
///Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard
///</summary>
OEM_102 = 0xE2,
///<summary>
///Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key
///</summary>
PROCESSKEY = 0xE5,
///<summary>
///Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes.
///The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information,
///see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
///</summary>
PACKET = 0xE7,
///<summary>
///Attn key
///</summary>
ATTN = 0xF6,
///<summary>
///CrSel key
///</summary>
CRSEL = 0xF7,
///<summary>
///ExSel key
///</summary>
EXSEL = 0xF8,
///<summary>
///Erase EOF key
///</summary>
EREOF = 0xF9,
///<summary>
///Play key
///</summary>
PLAY = 0xFA,
///<summary>
///Zoom key
///</summary>
ZOOM = 0xFB,
///<summary>
///Reserved
///</summary>
NONAME = 0xFC,
///<summary>
///PA1 key
///</summary>
PA1 = 0xFD,
///<summary>
///Clear key
///</summary>
OEM_CLEAR = 0xFE
internal enum ScanCodeShort : short
LBUTTON = 0,
RBUTTON = 0,
CANCEL = 70,
MBUTTON = 0,
XBUTTON1 = 0,
XBUTTON2 = 0,
BACK = 14,
TAB = 15,
CLEAR = 76,
RETURN = 28,
SHIFT = 42,
CONTROL = 29,
MENU = 56,
PAUSE = 0,
CAPITAL = 58,
KANA = 0,
HANGUL = 0,
JUNJA = 0,
FINAL = 0,
HANJA = 0,
KANJI = 0,
ESCAPE = 1,
CONVERT = 0,
NONCONVERT = 0,
ACCEPT = 0,
MODECHANGE = 0,
SPACE = 57,
PRIOR = 73,
NEXT = 81,
END = 79,
HOME = 71,
LEFT = 75,
UP = 72,
RIGHT = 77,
DOWN = 80,
SELECT = 0,
PRINT = 0,
EXECUTE = 0,
SNAPSHOT = 84,
INSERT = 82,
DELETE = 83,
HELP = 99,
KEY_0 = 11,
KEY_1 = 2,
KEY_2 = 3,
KEY_3 = 4,
KEY_4 = 5,
KEY_5 = 6,
KEY_6 = 7,
KEY_7 = 8,
KEY_8 = 9,
KEY_9 = 10,
KEY_A = 30,
KEY_B = 48,
KEY_C = 46,
KEY_D = 32,
KEY_E = 18,
KEY_F = 33,
KEY_G = 34,
KEY_H = 35,
KEY_I = 23,
KEY_J = 36,
KEY_K = 37,
KEY_L = 38,
KEY_M = 50,
KEY_N = 49,
KEY_O = 24,
KEY_P = 25,
KEY_Q = 16,
KEY_R = 19,
KEY_S = 31,
KEY_T = 20,
KEY_U = 22,
KEY_V = 47,
KEY_W = 17,
KEY_X = 45,
KEY_Y = 21,
KEY_Z = 44,
LWIN = 91,
RWIN = 92,
APPS = 93,
SLEEP = 95,
NUMPAD0 = 82,
NUMPAD1 = 79,
NUMPAD2 = 80,
NUMPAD3 = 81,
NUMPAD4 = 75,
NUMPAD5 = 76,
NUMPAD6 = 77,
NUMPAD7 = 71,
NUMPAD8 = 72,
NUMPAD9 = 73,
MULTIPLY = 55,
ADD = 78,
SEPARATOR = 0,
SUBTRACT = 74,
DECIMAL = 83,
DIVIDE = 53,
F1 = 59,
F2 = 60,
F3 = 61,
F4 = 62,
F5 = 63,
F6 = 64,
F7 = 65,
F8 = 66,
F9 = 67,
F10 = 68,
F11 = 87,
F12 = 88,
F13 = 100,
F14 = 101,
F15 = 102,
F16 = 103,
F17 = 104,
F18 = 105,
F19 = 106,
F20 = 107,
F21 = 108,
F22 = 109,
F23 = 110,
F24 = 118,
NUMLOCK = 69,
SCROLL = 70,
LSHIFT = 42,
RSHIFT = 54,
LCONTROL = 29,
RCONTROL = 29,
LMENU = 56,
RMENU = 56,
BROWSER_BACK = 106,
BROWSER_FORWARD = 105,
BROWSER_REFRESH = 103,
BROWSER_STOP = 104,
BROWSER_SEARCH = 101,
BROWSER_FAVORITES = 102,
BROWSER_HOME = 50,
VOLUME_MUTE = 32,
VOLUME_DOWN = 46,
VOLUME_UP = 48,
MEDIA_NEXT_TRACK = 25,
MEDIA_PREV_TRACK = 16,
MEDIA_STOP = 36,
MEDIA_PLAY_PAUSE = 34,
LAUNCH_MAIL = 108,
LAUNCH_MEDIA_SELECT = 109,
LAUNCH_APP1 = 107,
LAUNCH_APP2 = 33,
OEM_1 = 39,
OEM_PLUS = 13,
OEM_COMMA = 51,
OEM_MINUS = 12,
OEM_PERIOD = 52,
OEM_2 = 53,
OEM_3 = 41,
OEM_4 = 26,
OEM_5 = 43,
OEM_6 = 27,
OEM_7 = 40,
OEM_8 = 0,
OEM_102 = 86,
PROCESSKEY = 0,
PACKET = 0,
ATTN = 0,
CRSEL = 0,
EXSEL = 0,
EREOF = 93,
PLAY = 0,
ZOOM = 98,
NONAME = 0,
PA1 = 0,
OEM_CLEAR = 0,
/// <summary>
/// Define HARDWAREINPUT struct
/// </summary>
[StructLayout(LayoutKind.Sequential)]
internal struct HARDWAREINPUT
internal int uMsg;
internal short wParamL;
internal short wParamH;
【讨论】:
谢谢,我一定要试试这个!看起来很有希望!也感谢您非常详细的回复!而不是仅仅告诉我我需要做什么,你实际上帮助我学会了如何去做! 太棒了!我有一个简单的问题,您将如何模拟按键向下和向上按键?非常感谢你@Gareth @Gareth:我修好了。我想“按下”一个键,然后在“按下”另一个键之前等待一段时间(1 秒左右)。我使用了多个 SendInput 调用并且它有效。不过,很棒的代码!谢谢! 太棒了!谢谢。例如,当您想要打印大写字母时,情况如何。所以你需要按住 shift 和 + 字母。如何模拟? 仅供参考,为避免大量虚拟键/扫描码枚举,只需使用 MapVirtualKeyA (docs.microsoft.com/en-us/windows/win32/api/winuser/…),这样您就可以使用 WinForms 库中的 Keys 枚举(转换为 uint)将返回相应的扫描码。【参考方案2】:我喜欢@Gareth 的做法。但是,在他的方法中,您需要将击键硬编码到 SendInputWithAPI() 方法中。我对代码做了一些修改;您现在可以调用 Send() 并将 ScanCodeShort 参数传递给它。这使您可以在任何时间、任何地点将任何击键传递给它。
public class Keyboard
public void Send(ScanCodeShort a)
INPUT[] Inputs = new INPUT[1];
INPUT Input = new INPUT();
Input.type = 1; // 1 = Keyboard Input
Input.U.ki.wScan = a;
Input.U.ki.dwFlags = KEYEVENTF.SCANCODE;
Inputs[0] = Input;
SendInput(1, Inputs, INPUT.Size);
/// <summary>
/// Declaration of external SendInput method
/// </summary>
[DllImport("user32.dll")]
internal static extern uint SendInput(
uint nInputs,
[MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
int cbSize);
// Declare the INPUT struct
[StructLayout(LayoutKind.Sequential)]
public struct INPUT
public uint type;
public InputUnion U;
public static int Size
get return Marshal.SizeOf(typeof(INPUT));
// Declare the InputUnion struct
[StructLayout(LayoutKind.Explicit)]
public struct InputUnion
[FieldOffset(0)]
internal MOUSEINPUT mi;
[FieldOffset(0)]
internal KEYBDINPUT ki;
[FieldOffset(0)]
internal HARDWAREINPUT hi;
[StructLayout(LayoutKind.Sequential)]
public struct MOUSEINPUT
internal int dx;
internal int dy;
internal MouseEventDataXButtons mouseData;
internal MOUSEEVENTF dwFlags;
internal uint time;
internal UIntPtr dwExtraInfo;
[Flags]
public enum MouseEventDataXButtons : uint
Nothing = 0x00000000,
XBUTTON1 = 0x00000001,
XBUTTON2 = 0x00000002
[Flags]
public enum MOUSEEVENTF : uint
ABSOLUTE = 0x8000,
HWHEEL = 0x01000,
MOVE = 0x0001,
MOVE_NOCOALESCE = 0x2000,
LEFTDOWN = 0x0002,
LEFTUP = 0x0004,
RIGHTDOWN = 0x0008,
RIGHTUP = 0x0010,
MIDDLEDOWN = 0x0020,
MIDDLEUP = 0x0040,
VIRTUALDESK = 0x4000,
WHEEL = 0x0800,
XDOWN = 0x0080,
XUP = 0x0100
[StructLayout(LayoutKind.Sequential)]
public struct KEYBDINPUT
internal VirtualKeyShort wVk;
internal ScanCodeShort wScan;
internal KEYEVENTF dwFlags;
internal int time;
internal UIntPtr dwExtraInfo;
[Flags]
public enum KEYEVENTF : uint
EXTENDEDKEY = 0x0001,
KEYUP = 0x0002,
SCANCODE = 0x0008,
UNICODE = 0x0004
public enum VirtualKeyShort : short
///<summary>
///Left mouse button
///</summary>
LBUTTON = 0x01,
///<summary>
///Right mouse button
///</summary>
RBUTTON = 0x02,
///<summary>
///Control-break processing
///</summary>
CANCEL = 0x03,
///<summary>
///Middle mouse button (three-button mouse)
///</summary>
MBUTTON = 0x04,
///<summary>
///Windows 2000/XP: X1 mouse button
///</summary>
XBUTTON1 = 0x05,
///<summary>
///Windows 2000/XP: X2 mouse button
///</summary>
XBUTTON2 = 0x06,
///<summary>
///BACKSPACE key
///</summary>
BACK = 0x08,
///<summary>
///TAB key
///</summary>
TAB = 0x09,
///<summary>
///CLEAR key
///</summary>
CLEAR = 0x0C,
///<summary>
///ENTER key
///</summary>
RETURN = 0x0D,
///<summary>
///SHIFT key
///</summary>
SHIFT = 0x10,
///<summary>
///CTRL key
///</summary>
CONTROL = 0x11,
///<summary>
///ALT key
///</summary>
MENU = 0x12,
///<summary>
///PAUSE key
///</summary>
PAUSE = 0x13,
///<summary>
///CAPS LOCK key
///</summary>
CAPITAL = 0x14,
///<summary>
///Input Method Editor (IME) Kana mode
///</summary>
KANA = 0x15,
///<summary>
///IME Hangul mode
///</summary>
HANGUL = 0x15,
///<summary>
///IME Junja mode
///</summary>
JUNJA = 0x17,
///<summary>
///IME final mode
///</summary>
FINAL = 0x18,
///<summary>
///IME Hanja mode
///</summary>
HANJA = 0x19,
///<summary>
///IME Kanji mode
///</summary>
KANJI = 0x19,
///<summary>
///ESC key
///</summary>
ESCAPE = 0x1B,
///<summary>
///IME convert
///</summary>
CONVERT = 0x1C,
///<summary>
///IME nonconvert
///</summary>
NONCONVERT = 0x1D,
///<summary>
///IME accept
///</summary>
ACCEPT = 0x1E,
///<summary>
///IME mode change request
///</summary>
MODECHANGE = 0x1F,
///<summary>
///SPACEBAR
///</summary>
SPACE = 0x20,
///<summary>
///PAGE UP key
///</summary>
PRIOR = 0x21,
///<summary>
///PAGE DOWN key
///</summary>
NEXT = 0x22,
///<summary>
///END key
///</summary>
END = 0x23,
///<summary>
///HOME key
///</summary>
HOME = 0x24,
///<summary>
///LEFT ARROW key
///</summary>
LEFT = 0x25,
///<summary>
///UP ARROW key
///</summary>
UP = 0x26,
///<summary>
///RIGHT ARROW key
///</summary>
RIGHT = 0x27,
///<summary>
///DOWN ARROW key
///</summary>
DOWN = 0x28,
///<summary>
///SELECT key
///</summary>
SELECT = 0x29,
///<summary>
///PRINT key
///</summary>
PRINT = 0x2A,
///<summary>
///EXECUTE key
///</summary>
EXECUTE = 0x2B,
///<summary>
///PRINT SCREEN key
///</summary>
SNAPSHOT = 0x2C,
///<summary>
///INS key
///</summary>
INSERT = 0x2D,
///<summary>
///DEL key
///</summary>
DELETE = 0x2E,
///<summary>
///HELP key
///</summary>
HELP = 0x2F,
///<summary>
///0 key
///</summary>
KEY_0 = 0x30,
///<summary>
///1 key
///</summary>
KEY_1 = 0x31,
///<summary>
///2 key
///</summary>
KEY_2 = 0x32,
///<summary>
///3 key
///</summary>
KEY_3 = 0x33,
///<summary>
///4 key
///</summary>
KEY_4 = 0x34,
///<summary>
///5 key
///</summary>
KEY_5 = 0x35,
///<summary>
///6 key
///</summary>
KEY_6 = 0x36,
///<summary>
///7 key
///</summary>
KEY_7 = 0x37,
///<summary>
///8 key
///</summary>
KEY_8 = 0x38,
///<summary>
///9 key
///</summary>
KEY_9 = 0x39,
///<summary>
///A key
///</summary>
KEY_A = 0x41,
///<summary>
///B key
///</summary>
KEY_B = 0x42,
///<summary>
///C key
///</summary>
KEY_C = 0x43,
///<summary>
///D key
///</summary>
KEY_D = 0x44,
///<summary>
///E key
///</summary>
KEY_E = 0x45,
///<summary>
///F key
///</summary>
KEY_F = 0x46,
///<summary>
///G key
///</summary>
KEY_G = 0x47,
///<summary>
///H key
///</summary>
KEY_H = 0x48,
///<summary>
///I key
///</summary>
KEY_I = 0x49,
///<summary>
///J key
///</summary>
KEY_J = 0x4A,
///<summary>
///K key
///</summary>
KEY_K = 0x4B,
///<summary>
///L key
///</summary>
KEY_L = 0x4C,
///<summary>
///M key
///</summary>
KEY_M = 0x4D,
///<summary>
///N key
///</summary>
KEY_N = 0x4E,
///<summary>
///O key
///</summary>
KEY_O = 0x4F,
///<summary>
///P key
///</summary>
KEY_P = 0x50,
///<summary>
///Q key
///</summary>
KEY_Q = 0x51,
///<summary>
///R key
///</summary>
KEY_R = 0x52,
///<summary>
///S key
///</summary>
KEY_S = 0x53,
///<summary>
///T key
///</summary>
KEY_T = 0x54,
///<summary>
///U key
///</summary>
KEY_U = 0x55,
///<summary>
///V key
///</summary>
KEY_V = 0x56,
///<summary>
///W key
///</summary>
KEY_W = 0x57,
///<summary>
///X key
///</summary>
KEY_X = 0x58,
///<summary>
///Y key
///</summary>
KEY_Y = 0x59,
///<summary>
///Z key
///</summary>
KEY_Z = 0x5A,
///<summary>
///Left Windows key (Microsoft Natural keyboard)
///</summary>
LWIN = 0x5B,
///<summary>
///Right Windows key (Natural keyboard)
///</summary>
RWIN = 0x5C,
///<summary>
///Applications key (Natural keyboard)
///</summary>
APPS = 0x5D,
///<summary>
///Computer Sleep key
///</summary>
SLEEP = 0x5F,
///<summary>
///Numeric keypad 0 key
///</summary>
NUMPAD0 = 0x60,
///<summary>
///Numeric keypad 1 key
///</summary>
NUMPAD1 = 0x61,
///<summary>
///Numeric keypad 2 key
///</summary>
NUMPAD2 = 0x62,
///<summary>
///Numeric keypad 3 key
///</summary>
NUMPAD3 = 0x63,
///<summary>
///Numeric keypad 4 key
///</summary>
NUMPAD4 = 0x64,
///<summary>
///Numeric keypad 5 key
///</summary>
NUMPAD5 = 0x65,
///<summary>
///Numeric keypad 6 key
///</summary>
NUMPAD6 = 0x66,
///<summary>
///Numeric keypad 7 key
///</summary>
NUMPAD7 = 0x67,
///<summary>
///Numeric keypad 8 key
///</summary>
NUMPAD8 = 0x68,
///<summary>
///Numeric keypad 9 key
///</summary>
NUMPAD9 = 0x69,
///<summary>
///Multiply key
///</summary>
MULTIPLY = 0x6A,
///<summary>
///Add key
///</summary>
ADD = 0x6B,
///<summary>
///Separator key
///</summary>
SEPARATOR = 0x6C,
///<summary>
///Subtract key
///</summary>
SUBTRACT = 0x6D,
///<summary>
///Decimal key
///</summary>
DECIMAL = 0x6E,
///<summary>
///Divide key
///</summary>
DIVIDE = 0x6F,
///<summary>
///F1 key
///</summary>
F1 = 0x70,
///<summary>
///F2 key
///</summary>
F2 = 0x71,
///<summary>
///F3 key
///</summary>
F3 = 0x72,
///<summary>
///F4 key
///</summary>
F4 = 0x73,
///<summary>
///F5 key
///</summary>
F5 = 0x74,
///<summary>
///F6 key
///</summary>
F6 = 0x75,
///<summary>
///F7 key
///</summary>
F7 = 0x76,
///<summary>
///F8 key
///</summary>
F8 = 0x77,
///<summary>
///F9 key
///</summary>
F9 = 0x78,
///<summary>
///F10 key
///</summary>
F10 = 0x79,
///<summary>
///F11 key
///</summary>
F11 = 0x7A,
///<summary>
///F12 key
///</summary>
F12 = 0x7B,
///<summary>
///F13 key
///</summary>
F13 = 0x7C,
///<summary>
///F14 key
///</summary>
F14 = 0x7D,
///<summary>
///F15 key
///</summary>
F15 = 0x7E,
///<summary>
///F16 key
///</summary>
F16 = 0x7F,
///<summary>
///F17 key
///</summary>
F17 = 0x80,
///<summary>
///F18 key
///</summary>
F18 = 0x81,
///<summary>
///F19 key
///</summary>
F19 = 0x82,
///<summary>
///F20 key
///</summary>
F20 = 0x83,
///<summary>
///F21 key
///</summary>
F21 = 0x84,
///<summary>
///F22 key, (PPC only) Key used to lock device.
///</summary>
F22 = 0x85,
///<summary>
///F23 key
///</summary>
F23 = 0x86,
///<summary>
///F24 key
///</summary>
F24 = 0x87,
///<summary>
///NUM LOCK key
///</summary>
NUMLOCK = 0x90,
///<summary>
///SCROLL LOCK key
///</summary>
SCROLL = 0x91,
///<summary>
///Left SHIFT key
///</summary>
LSHIFT = 0xA0,
///<summary>
///Right SHIFT key
///</summary>
RSHIFT = 0xA1,
///<summary>
///Left CONTROL key
///</summary>
LCONTROL = 0xA2,
///<summary>
///Right CONTROL key
///</summary>
RCONTROL = 0xA3,
///<summary>
///Left MENU key
///</summary>
LMENU = 0xA4,
///<summary>
///Right MENU key
///</summary>
RMENU = 0xA5,
///<summary>
///Windows 2000/XP: Browser Back key
///</summary>
BROWSER_BACK = 0xA6,
///<summary>
///Windows 2000/XP: Browser Forward key
///</summary>
BROWSER_FORWARD = 0xA7,
///<summary>
///Windows 2000/XP: Browser Refresh key
///</summary>
BROWSER_REFRESH = 0xA8,
///<summary>
///Windows 2000/XP: Browser Stop key
///</summary>
BROWSER_STOP = 0xA9,
///<summary>
///Windows 2000/XP: Browser Search key
///</summary>
BROWSER_SEARCH = 0xAA,
///<summary>
///Windows 2000/XP: Browser Favorites key
///</summary>
BROWSER_FAVORITES = 0xAB,
///<summary>
///Windows 2000/XP: Browser Start and Home key
///</summary>
BROWSER_HOME = 0xAC,
///<summary>
///Windows 2000/XP: Volume Mute key
///</summary>
VOLUME_MUTE = 0xAD,
///<summary>
///Windows 2000/XP: Volume Down key
///</summary>
VOLUME_DOWN = 0xAE,
///<summary>
///Windows 2000/XP: Volume Up key
///</summary>
VOLUME_UP = 0xAF,
///<summary>
///Windows 2000/XP: Next Track key
///</summary>
MEDIA_NEXT_TRACK = 0xB0,
///<summary>
///Windows 2000/XP: Previous Track key
///</summary>
MEDIA_PREV_TRACK = 0xB1,
///<summary>
///Windows 2000/XP: Stop Media key
///</summary>
MEDIA_STOP = 0xB2,
///<summary>
///Windows 2000/XP: Play/Pause Media key
///</summary>
MEDIA_PLAY_PAUSE = 0xB3,
///<summary>
///Windows 2000/XP: Start Mail key
///</summary>
LAUNCH_MAIL = 0xB4,
///<summary>
///Windows 2000/XP: Select Media key
///</summary>
LAUNCH_MEDIA_SELECT = 0xB5,
///<summary>
///Windows 2000/XP: Start Application 1 key
///</summary>
LAUNCH_APP1 = 0xB6,
///<summary>
///Windows 2000/XP: Start Application 2 key
///</summary>
LAUNCH_APP2 = 0xB7,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_1 = 0xBA,
///<summary>
///Windows 2000/XP: For any country/region, the '+' key
///</summary>
OEM_PLUS = 0xBB,
///<summary>
///Windows 2000/XP: For any country/region, the ',' key
///</summary>
OEM_COMMA = 0xBC,
///<summary>
///Windows 2000/XP: For any country/region, the '-' key
///</summary>
OEM_MINUS = 0xBD,
///<summary>
///Windows 2000/XP: For any country/region, the '.' key
///</summary>
OEM_PERIOD = 0xBE,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_2 = 0xBF,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_3 = 0xC0,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_4 = 0xDB,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_5 = 0xDC,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_6 = 0xDD,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_7 = 0xDE,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_8 = 0xDF,
///<summary>
///Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard
///</summary>
OEM_102 = 0xE2,
///<summary>
///Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key
///</summary>
PROCESSKEY = 0xE5,
///<summary>
///Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes.
///The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information,
///see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
///</summary>
PACKET = 0xE7,
///<summary>
///Attn key
///</summary>
ATTN = 0xF6,
///<summary>
///CrSel key
///</summary>
CRSEL = 0xF7,
///<summary>
///ExSel key
///</summary>
EXSEL = 0xF8,
///<summary>
///Erase EOF key
///</summary>
EREOF = 0xF9,
///<summary>
///Play key
///</summary>
PLAY = 0xFA,
///<summary>
///Zoom key
///</summary>
ZOOM = 0xFB,
///<summary>
///Reserved
///</summary>
NONAME = 0xFC,
///<summary>
///PA1 key
///</summary>
PA1 = 0xFD,
///<summary>
///Clear key
///</summary>
OEM_CLEAR = 0xFE
public enum ScanCodeShort : short
LBUTTON = 0,
RBUTTON = 0,
CANCEL = 70,
MBUTTON = 0,
XBUTTON1 = 0,
XBUTTON2 = 0,
BACK = 14,
TAB = 15,
CLEAR = 76,
RETURN = 28,
SHIFT = 42,
CONTROL = 29,
MENU = 56,
PAUSE = 0,
CAPITAL = 58,
KANA = 0,
HANGUL = 0,
JUNJA = 0,
FINAL = 0,
HANJA = 0,
KANJI = 0,
ESCAPE = 1,
CONVERT = 0,
NONCONVERT = 0,
ACCEPT = 0,
MODECHANGE = 0,
SPACE = 57,
PRIOR = 73,
NEXT = 81,
END = 79,
HOME = 71,
LEFT = 75,
UP = 72,
RIGHT = 77,
DOWN = 80,
SELECT = 0,
PRINT = 0,
EXECUTE = 0,
SNAPSHOT = 84,
INSERT = 82,
DELETE = 83,
HELP = 99,
KEY_0 = 11,
KEY_1 = 2,
KEY_2 = 3,
KEY_3 = 4,
KEY_4 = 5,
KEY_5 = 6,
KEY_6 = 7,
KEY_7 = 8,
KEY_8 = 9,
KEY_9 = 10,
KEY_A = 30,
KEY_B = 48,
KEY_C = 46,
KEY_D = 32,
KEY_E = 18,
KEY_F = 33,
KEY_G = 34,
KEY_H = 35,
KEY_I = 23,
KEY_J = 36,
KEY_K = 37,
KEY_L = 38,
KEY_M = 50,
KEY_N = 49,
KEY_O = 24,
KEY_P = 25,
KEY_Q = 16,
KEY_R = 19,
KEY_S = 31,
KEY_T = 20,
KEY_U = 22,
KEY_V = 47,
KEY_W = 17,
KEY_X = 45,
KEY_Y = 21,
KEY_Z = 44,
LWIN = 91,
RWIN = 92,
APPS = 93,
SLEEP = 95,
NUMPAD0 = 82,
NUMPAD1 = 79,
NUMPAD2 = 80,
NUMPAD3 = 81,
NUMPAD4 = 75,
NUMPAD5 = 76,
NUMPAD6 = 77,
NUMPAD7 = 71,
NUMPAD8 = 72,
NUMPAD9 = 73,
MULTIPLY = 55,
ADD = 78,
SEPARATOR = 0,
SUBTRACT = 74,
DECIMAL = 83,
DIVIDE = 53,
F1 = 59,
F2 = 60,
F3 = 61,
F4 = 62,
F5 = 63,
F6 = 64,
F7 = 65,
F8 = 66,
F9 = 67,
F10 = 68,
F11 = 87,
F12 = 88,
F13 = 100,
F14 = 101,
F15 = 102,
F16 = 103,
F17 = 104,
F18 = 105,
F19 = 106,
F20 = 107,
F21 = 108,
F22 = 109,
F23 = 110,
F24 = 118,
NUMLOCK = 69,
SCROLL = 70,
LSHIFT = 42,
RSHIFT = 54,
LCONTROL = 29,
RCONTROL = 29,
LMENU = 56,
RMENU = 56,
BROWSER_BACK = 106,
BROWSER_FORWARD = 105,
BROWSER_REFRESH = 103,
BROWSER_STOP = 104,
BROWSER_SEARCH = 101,
BROWSER_FAVORITES = 102,
BROWSER_HOME = 50,
VOLUME_MUTE = 32,
VOLUME_DOWN = 46,
VOLUME_UP = 48,
MEDIA_NEXT_TRACK = 25,
MEDIA_PREV_TRACK = 16,
MEDIA_STOP = 36,
MEDIA_PLAY_PAUSE = 34,
LAUNCH_MAIL = 108,
LAUNCH_MEDIA_SELECT = 109,
LAUNCH_APP1 = 107,
LAUNCH_APP2 = 33,
OEM_1 = 39,
OEM_PLUS = 13,
OEM_COMMA = 51,
OEM_MINUS = 12,
OEM_PERIOD = 52,
OEM_2 = 53,
OEM_3 = 41,
OEM_4 = 26,
OEM_5 = 43,
OEM_6 = 27,
OEM_7 = 40,
OEM_8 = 0,
OEM_102 = 86,
PROCESSKEY = 0,
PACKET = 0,
ATTN = 0,
CRSEL = 0,
EXSEL = 0,
EREOF = 93,
PLAY = 0,
ZOOM = 98,
NONAME = 0,
PA1 = 0,
OEM_CLEAR = 0,
/// <summary>
/// Define HARDWAREINPUT struct
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct HARDWAREINPUT
internal int uMsg;
internal short wParamL;
internal short wParamH;
【讨论】:
如果您的游戏以管理员身份运行,请不要忘记以管理员身份运行脚本。否则游戏将不会接收输入。 - 花了我 2 个小时来找出答案。 仅供参考,为避免大量虚拟键/扫描码枚举,只需使用 MapVirtualKeyA (docs.microsoft.com/en-us/windows/win32/api/winuser/…),这样您就可以使用 WinForms 库中的 Keys 枚举(转换为 uint)将返回相应的扫描码。 这个确实搞砸了我电脑上的输入,不管我做了什么尝试修复它都会锁定我的 Shift 键并强制我重新启动。【参考方案3】:除了@gareth 的出色回答之外,要在判刑期间模拟大写字母,您可以在下面使用我的解决方案..
public static void SendWithShift(ScanCodeShort a)
HoldLShift();
Send(a);
ReleaseLShift();
public static void HoldLShift()
var Inputs = new InputStruct[1];
var Input = new InputStruct();
Input.type = 1;
Input.U.ki.wScan = ScanCodeShort.LSHIFT;
Input.U.ki.dwFlags = KeyEventF.SCANCODE;
Inputs[0] = Input;
SendInput(1, Inputs, InputStruct.Size);
public static void ReleaseLShift()
var Inputs = new InputStruct[1];
var Input = new InputStruct();
Input.type = 1;
Input.U.ki.wScan = ScanCodeShort.LSHIFT;
Input.U.ki.dwFlags = KeyEventF.KEYUP | KeyEventF.SCANCODE;
Inputs[0] = Input;
SendInput(1, Inputs, InputStruct.Size);
public static void Send(ScanCodeShort a)
var Inputs = new InputStruct[1];
var Input = new InputStruct();
Input.type = 1;
Input.U.ki.wScan = a;
Input.U.ki.dwFlags = KeyEventF.SCANCODE;
Inputs[0] = Input;
SendInput(1, Inputs, InputStruct.Size);
要发送 shift 并保持,您只需要发送,但要释放 shift,您需要添加 keyup 标志,而不仅仅是设置它。
【讨论】:
【参考方案4】:我一直在寻找多媒体按钮按下的仿真,发现您需要使用这些参数(在 @Gareth 代码中):
Input.U.ki.wVk = VirtualKeyShort.VOLUME_MUTE;
Input.U.ki.dwFlags = KEYEVENTF.UNICODE;
【讨论】:
【参考方案5】:在keybd_event
上添加到@ogggre。我设法有一个工作的 DllImport:
[DllImport("user32.dll")]
internal static extern void keybd_event(
byte bVk,
byte bScan,
uint dwFlags,
uint dwExtraInfo
);
【讨论】:
【参考方案6】:我刚刚创建了一个库来使用 dotnet core 和多平台实现来模拟键盘和鼠标(光标)。
这里是github的链接:https://github.com/lucassklp/Desktop.Robot
【讨论】:
【参考方案7】:keybd_event
应该做的工作:
// Simulate a key press
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | 0,
0 );
// Simulate a key release
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0);
更多信息:http://msdn.microsoft.com/en-us/library/windows/desktop/ms646304(v=vs.85).aspx
【讨论】:
谢谢!我想这正是我要找的!我一定会尽快对其进行测试并回复您! 实际上我正在寻找可以与 C# 和 .NET 一起使用的东西。如果我使用 C++,我相信这会起作用,但是无论如何你可以给我 C# 参考吗?谢谢! 我刚试过 [DllImport("user32.dll", SetLastError = true)] static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);无济于事。【参考方案8】:添加到@Gareth 的解决方案,因为在调用Send()
后键卡住了。这是@Matthew Wherry 的ReleaseLShift()
的简化版本,因此它适用于任何键。
public static void ReleaseKey(ScanCodeShort key)
var Inputs = new INPUT[1];
var Input = new INPUT();
Input.type = 1;
Input.U.ki.wScan = key;
Input.U.ki.dwFlags = KEYEVENTF.KEYUP | KEYEVENTF.SCANCODE;
Inputs[0] = Input;
SendInput(1, Inputs, INPUT.Size);
【讨论】:
【参考方案9】:您可以使用SendKeys.Send("<your character/string>");
示例:
SendKeys.Send("ENTER");
来源:https://docs.microsoft.com/en-us/dotnet/framework/winforms/how-to-simulate-mouse-and-keyboard-events-in-code
【讨论】:
SendKeys.Send(string)
在 Windows 10 中的支持有限,并不适用于所有用例。如果有人确实使用了这个答案的内容,请注意它可能无法正常工作的可能性非零。【参考方案10】:
Windows 输入模拟器让这变得超级简单。
Windows 输入模拟器提供了一个简单的 .NET (C#) 接口,用于使用 Win32 SendInput 方法模拟键盘或鼠标输入。所有的互操作都是为您完成的,并且有一个用于发送多个击键的简单编程模型。 Nuget 包 -> 安装包 InputSimulator
https://inputsimulator.codeplex.com/
【讨论】:
张贴duplicate answers 是不受欢迎的。特别是这些答案看起来更像是广告文案而不是编程答案,这也使它们看起来像是垃圾邮件。如果无法针对特定问题量身定制答案,则简单的评论将是更好的选择。 感谢您尝试帮助其他用户。感谢您的努力。以上是关于在 C# 中模拟键盘输入的主要内容,如果未能解决你的问题,请参考以下文章