时间:2015-11-4 作者:悬浮的青春 分类: .net相关
很棒的win32模拟鼠标键盘操作api 支持模拟键盘及鼠标操作。
全局模拟。
不需要确定输入窗口。
很好用。
下面直接贴代码:
public class Win32Api { public const int INPUT_MOUSE = 0; public const int INPUT_KEYBOARD = 1; public const int INPUT_HARDWARE = 2; public const uint KEYEVENTF_EXTENDEDKEY = 0x0001; public const uint KEYEVENTF_KEYUP = 0x0002; public const uint KEYEVENTF_UNICODE = 0x0004; public const uint KEYEVENTF_SCANCODE = 0x0008; public const uint XBUTTON1 = 0x0001; public const uint XBUTTON2 = 0x0002; public const uint MOUSEEVENTF_MOVE = 0x0001; public const uint MOUSEEVENTF_LEFTDOWN = 0x0002; public const uint MOUSEEVENTF_LEFTUP = 0x0004; public const uint MOUSEEVENTF_RIGHTDOWN = 0x0008; public const uint MOUSEEVENTF_RIGHTUP = 0x0010; public const uint MOUSEEVENTF_MIDDLEDOWN = 0x0020; public const uint MOUSEEVENTF_MIDDLEUP = 0x0040; public const uint MOUSEEVENTF_XDOWN = 0x0080; public const uint MOUSEEVENTF_XUP = 0x0100; public const uint MOUSEEVENTF_WHEEL = 0x0800; public const uint MOUSEEVENTF_VIRTUALDESK = 0x4000; public const uint MOUSEEVENTF_ABSOLUTE = 0x8000; public const int SM_CXSCREEN = 0; public const int SM_CYSCREEN = 1; [DllImport("User32.dll")] public static extern uint SendInput(uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] Input[] input, int structSize); [DllImport("user32.dll")] public static extern IntPtr GetMessageExtraInfo(); [DllImport("kernel32.dll")] public static extern int GetTickCount(); [DllImport("user32.dll")] public static extern bool GetCursorPos(out Point pt); [DllImport("user32.dll")] public static extern int GetSystemMetrics(int nIndex); public static void KeyDown(Keys key) { Input[] inputs = new Input[1]; inputs[0].type = INPUT_KEYBOARD; inputs[0].keyboardInput.wVk = (short)key; inputs[0].keyboardInput.dwFlags = 0; inputs[0].keyboardInput.time = GetTickCount(); inputs[0].keyboardInput.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0])); } public static void KeyUp(Keys key) { Input[] inputs = new Input[1]; inputs[0].type = INPUT_KEYBOARD; inputs[0].keyboardInput.wVk = (short)key; inputs[0].keyboardInput.dwFlags = (int)KEYEVENTF_KEYUP; inputs[0].keyboardInput.time = GetTickCount(); inputs[0].keyboardInput.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0])); } public static void MouseLeftKeyDown() { Input[] inputs = new Input[1]; inputs[0].type = INPUT_MOUSE; inputs[0].mouseInput.dx = 0; inputs[0].mouseInput.dy = 0; inputs[0].mouseInput.mouseData = 0; inputs[0].mouseInput.dwFlags = (int)MOUSEEVENTF_LEFTDOWN; inputs[0].mouseInput.time = GetTickCount(); inputs[0].mouseInput.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0])); } public static void MouseLeftKeyUp() { Input[] inputs = new Input[1]; inputs[0].type = INPUT_MOUSE; inputs[0].mouseInput.dx = 0; inputs[0].mouseInput.dy = 0; inputs[0].mouseInput.mouseData = 0; inputs[0].mouseInput.dwFlags = (int)MOUSEEVENTF_LEFTUP; inputs[0].mouseInput.time = GetTickCount(); inputs[0].mouseInput.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0])); } public static void MouseRightKeyDown() { Input[] inputs = new Input[1]; inputs[0].type = INPUT_MOUSE; inputs[0].mouseInput.dx = 0; inputs[0].mouseInput.dy = 0; inputs[0].mouseInput.mouseData = 0; inputs[0].mouseInput.dwFlags = (int)MOUSEEVENTF_RIGHTDOWN; inputs[0].mouseInput.time = GetTickCount(); inputs[0].mouseInput.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0])); } public static void MouseRightKeyUp() { Input[] inputs = new Input[1]; inputs[0].type = INPUT_MOUSE; inputs[0].mouseInput.dx = 0; inputs[0].mouseInput.dy = 0; inputs[0].mouseInput.mouseData = 0; inputs[0].mouseInput.dwFlags = (int)MOUSEEVENTF_RIGHTUP; inputs[0].mouseInput.time = GetTickCount(); inputs[0].mouseInput.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0])); } public static void MouseMiddleKeyDown() { Input[] inputs = new Input[1]; inputs[0].type = INPUT_MOUSE; inputs[0].mouseInput.dx = 0; inputs[0].mouseInput.dy = 0; inputs[0].mouseInput.mouseData = 0; inputs[0].mouseInput.dwFlags = (short)MOUSEEVENTF_MIDDLEDOWN; inputs[0].mouseInput.time = GetTickCount(); inputs[0].mouseInput.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0])); } public static void MouseMiddleKeyUp() { Input[] inputs = new Input[1]; inputs[0].type = INPUT_MOUSE; inputs[0].mouseInput.dx = 0; inputs[0].mouseInput.dy = 0; inputs[0].mouseInput.mouseData = 0; inputs[0].mouseInput.dwFlags = (short)MOUSEEVENTF_MIDDLEUP; inputs[0].mouseInput.time = GetTickCount(); inputs[0].mouseInput.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0])); } public static void MouseMove(int cx, int cy) { Input[] inputs = new Input[1]; inputs[0].type = INPUT_MOUSE; inputs[0].mouseInput.dx = cy; inputs[0].mouseInput.dy = cy; inputs[0].mouseInput.mouseData = 0; inputs[0].mouseInput.dwFlags = (int)MOUSEEVENTF_MOVE; inputs[0].mouseInput.time = GetTickCount(); inputs[0].mouseInput.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0])); } public static void MouseMoveTo(int x, int y) { MouseMoveTo(x, y, 0, 0); } public static void MouseMoveTo(int x, int y, int maxMove, int interval) { Input[] inputs = new Input[1]; Point p = new Point(); int n; int perWidth = (0xFFFF / (GetSystemMetrics(SM_CXSCREEN) - 1)); int perHeight = (0xFFFF / (GetSystemMetrics(SM_CYSCREEN) - 1)); if (maxMove <= 0) { maxMove = 0x7FFFFFFF; } GetCursorPos(out p); while (p.X != x || p.Y != y) { n = x - p.X; if (Math.Abs(n) > maxMove) { if (n > 0) { n = maxMove; } else { n = -maxMove; } } p.X = p.X + n; n = y - p.Y; if (Math.Abs(n) > maxMove) { if (n > 0) { n = maxMove; } else { n = -maxMove; } } p.Y = p.Y + n; inputs[0].type = INPUT_MOUSE; inputs[0].mouseInput.dx = p.X * perWidth; inputs[0].mouseInput.dy = p.Y * perHeight; inputs[0].mouseInput.mouseData = 0; inputs[0].mouseInput.dwFlags = (int)(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE); inputs[0].mouseInput.time = GetTickCount(); inputs[0].mouseInput.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0])); if (interval != 0) { System.Threading.Thread.Sleep(interval); } } } public static void MouseWheel(int cz) { Input[] inputs = new Input[1]; inputs[0].type = INPUT_MOUSE; inputs[0].mouseInput.dx = 0; inputs[0].mouseInput.dy = 0; inputs[0].mouseInput.mouseData = cz; inputs[0].mouseInput.dwFlags = (int)MOUSEEVENTF_WHEEL; inputs[0].mouseInput.time = GetTickCount(); inputs[0].mouseInput.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0])); } [StructLayout(LayoutKind.Sequential)] public struct MouseInput { public int dx; public int dy; public int mouseData; public int dwFlags; public int time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] public struct KeyBoardInput { public short wVk; public short wScan; public int dwFlags; public int time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] public struct HardwareInput { public int uMsg; public short wParamL; public short wParamH; } [StructLayout(LayoutKind.Explicit)] public struct Input { [FieldOffset(0)] public int type; [FieldOffset(4)] public MouseInput mouseInput; [FieldOffset(4)] public KeyBoardInput keyboardInput; [FieldOffset(4)] public HardwareInput hardwardInput; } }
我在程序中用了。感觉很不错。
标签: net