摘要:[C#][API]SendInput
宣告:
[DllImport("user32.dll", SetLastError = true)]
internal static extern uint SendInput(uint nInput, ref INPUT pInput, int cbSize);
[StructLayout(LayoutKind.Explicit)]
internal struct INPUT
{
[FieldOffset(0)]
internal int type;//0:mouse event;1:keyboard event;2:hardware event
[FieldOffset(4)]
internal MOUSEINPUT mi;
[FieldOffset(4)]
internal KEYBDINPUT ki;
[FieldOffset(4)]
internal HARDWAREINPUT hi;
}
[StructLayout(LayoutKind.Sequential)]
internal struct HARDWAREINPUT
{
internal int uMsg;
internal short wParamL;
internal short wParamH;
}
[StructLayout(LayoutKind.Sequential)]
internal struct KEYBDINPUT
{
internal ushort wVk;
internal ushort wScan;
internal uint dwFlags;
internal uint time;
internal IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
internal struct MOUSEINPUT
{
internal int dx;
internal int dy;
internal int mouseData;
internal int dwFlags;
internal int time;
internal IntPtr dwExtraInfo;
}
使用:
//按住Caps Lock
INPUT Input=new INPUT();
Input.type = 1; //keyboard_input
Input.ki.wVk = 0x14; //CAPS_Lock
Input.ki.dwFlags = 0;
SendInput(1, ref Input, Marshal.SizeOf(Input));
//放開Caps Lock
Input = new INPUT();
Input.type = 1;
Input.ki.wVk = 0x14;
Input.ki.dwFlags = 2;//key_up
SendInput(1, ref Input, Marshal.SizeOf(Input));
要注意的是 雖然在MSDN 中SendInput的第二個參數 寫到 : An array of Input structures.
但實測後,並不能使用陣列的方式,否則會失敗並且得到參數錯誤(0x57)。
參考 SendInput