时间: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