核心 API
[DllImport("user32.dll", SetLastError = true)]
static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
// 定義 INPUT 結構體 (鍵盤/鼠標/硬件)
struct INPUT { public uint type; public InputUnion u; }
[StructLayout(LayoutKind.Explicit)]
struct InputUnion {
[FieldOffset(0)] public MOUSEINPUT mi;
[FieldOffset(0)] public KEYBDINPUT ki;
[FieldOffset(0)] public HARDWAREINPUT hi;
}
struct KEYBDINPUT {
public ushort wVk; public ushort wScan;
public uint dwFlags; public uint time; public IntPtr dwExtraInfo;
}
發送組合鍵示例 (Win+R)
const uint KEYEVENTF_KEYDOWN = 0x0000;
const uint KEYEVENTF_KEYUP = 0x0002;
const int VK_LWIN = 0x5B; const int VK_R = 0x52;
INPUT[] inputs = new INPUT[4];
// Win Down
inputs[0] = new INPUT { type=1, u=new InputUnion{ki=new KEYBDINPUT{wVk=VK_LWIN, dwFlags=KEYEVENTF_KEYDOWN}}};
// R Down
inputs[1] = new INPUT { type=1, u=new InputUnion{ki=new KEYBDINPUT{wVk=VK_R, dwFlags=KEYEVENTF_KEYDOWN}}};
// R Up
inputs[2] = new INPUT { type=1, u=new InputUnion{ki=new KEYBDINPUT{wVk=VK_R, dwFlags=KEYEVENTF_KEYUP}}};
// Win Up
inputs[3] = new INPUT { type=1, u=new InputUnion{ki=new KEYBDINPUT{wVk=VK_LWIN, dwFlags=KEYEVENTF_KEYUP}}};
SendInput(4, inputs, Marshal.SizeOf(typeof(INPUT)));
注意
- 需引用
System.Runtime.InteropServices
- 管理員權限程序可注入非管理員窗口,反之不行
- 推薦封裝為
KeyboardSimulator 類,提供 PressKeyCombination(params Keys[])