Python有一个可以操作键盘鼠标的库,众所周知,pyautogui,非常好用,但是只有Python的版本,搜寻了一下C#有没有类似的库,结果没有找到,于是自己就仿照部分功能封装了一下。封装的不是很好,没有进一步的封装,主要为大家提供一个思路可能,分享一下。主要平时自己用,没有进行优化,实现pyautogui的部分功能,小白一个,后面再改进吧。
整个工程文件也上次了,有需要可以参考一下,完善一下。
下面是下载的地址:C#版本的的PyAutoGui,功能类似Python的pyautogui-其它文档类资源-CSDN下载
B站之前看到“不高兴就喝水”UP主写了一个Python的自动化程序,这里也附带一个,可以根据自己需求改进。
下面是封装的CsAutoGui.dll的内容
using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; /// <summary> /// 仿照Python的pyautogui库,写的C#版本,实现部分功能,其余功能慢慢添加 /// 本dll可以控制鼠标位置,键盘输入,通过屏幕截图,来寻找在屏幕中的坐标位置等功能 /// </summary> namespace CsAutoGui { /// <summary> /// 鼠标三个键的枚举 /// </summary> public enum MouseButton { /// <summary> /// 左键 /// </summary> left, /// <summary> /// 右键 /// </summary> right, /// <summary> /// 中键 /// </summary> middle } /// <summary> /// 坐标信息的结构体 /// </summary> public struct Location { /// <summary> /// 在屏幕中的最小坐标X /// </summary> public int minX; /// <summary> /// 在屏幕中的最小坐标Y /// </summary> public int minY; /// <summary> /// 在屏幕中的最大坐标X /// </summary> public int maxX; /// <summary> /// 在屏幕中的最大坐标Y /// </summary> public int maxY; /// <summary> /// 中心坐标X /// </summary> public int centerX; /// <summary> /// 中心坐标Y /// </summary> public int centerY; /// <summary> /// 构造函数 /// </summary> /// <param name="minX">最小的x坐标位置</param> /// <param name="minY">最小的y坐标位置</param> /// <param name="maxX">最大的x坐标位置</param> /// <param name="maxY">最大的y坐标位置</param> /// <param name="centerX">中心的x坐标位置</param> /// <param name="centerY">中心的y坐标位置</param> public Location(int minX, int minY, int maxX, int maxY, int centerX, int centerY) { this.minX = minX; this.minY = minY; this.maxX = maxX; this.maxY = maxY; this.centerX = centerX; this.centerY = centerY; } /// <summary> /// Location是否为Null /// </summary> /// <returns>Null返回True</returns> public bool IsNull() { if (this.minX == 0 && this.minY == 0 && this.maxX == 0 && this.maxY == 0 && this.centerX == 0 && this.centerY == 0) { return true; } return false; } } /// <summary> /// 异常提醒类 /// </summary> class MyException : ApplicationException { private string error; private Exception innerException; //无参数构造函数 public MyException() { } //带一个字符串参数的构造函数,作用:当程序员用Exception类获取异常信息而非 MyException时把自定义异常信息传递过去 public MyException(string msg) : base(msg) { this.error = msg; } //带有一个字符串参数和一个内部异常信息参数的构造函数 public MyException(string msg, Exception innerException) : base(msg) { this.innerException = innerException; this.error = msg; } public string GetError() { return error; } } /// <summary> /// 封装的控制鼠标和键盘输入的底层类 /// </summary> class ControlMouseAndKeyBoard { #region MouseKeyBoardEvent [DllImport("user32")] private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); [DllImport("user32.dll")] private static extern bool SetCursorPos(int X, int Y); [DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)] private static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo); [DllImport("kernel32.dll")] private static extern int GlobalAlloc(int wFlags,int dwBytes); [DllImport("kernel32.dll")] private static extern int GlobalLock(int hMem); [DllImport("kernel32.dll")] private static extern int RtlMoveMemory(int muBiaoAdd, string scoreData,int size); [DllImport("kernel32.dll")] private static extern int GlobalUnlock(int hMem); [DllImport("user32")] private static extern int EmptyClipboard(); [DllImport("user32")] private static extern int OpenClipboard(int jianJiIntPrt); [DllImport("user32")] private static extern int SetClipboardData(int wFormat,int hMem); [DllImport("user32")] private static extern int CloseClipboard(); //移动鼠标 const int MOUSEEVENTF_MOVE = 0x0001; //模拟鼠标左键按下 const int MOUSEEVENTF_LEFTDOWN = 0x0002; //模拟鼠标左键抬起 const int MOUSEEVENTF_LEFTUP = 0x0004; //模拟鼠标右键按下 const int MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键抬起 const int MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标中键按下 const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模拟鼠标中键抬起 const int MOUSEEVENTF_MIDDLEUP = 0x0040; //标示是否采用绝对坐标 const int MOUSEEVENTF_ABSOLUTE = 0x8000; //模拟鼠标中间滚动 const int MOUSEEVENTF_WHEEL = 0x0800; //模拟按键按下 const int KEYEVENTF_KEYDOWN = 0; //模拟按键弹起 const int KEYEVENTF_KEYUP = 2; #endregion /// <summary> /// 热键组合键 /// </summary> /// <param name="keysOne">组合键1</param> /// <param name="keysTwo">组合键2</param> public static void HotKeyFun(Keys keysOne,Keys keysTwo) { keybd_event(keysOne, 0, 0, 0); keybd_event(keysTwo, 0, 0, 0); keybd_event(keysOne, 0, KEYEVENTF_KEYUP, 0); } /// <summary> /// 按下按键 /// </summary> /// <param name="keys">按下的键盘的keys枚举</param> public static void PressDownFun(Keys keys) { keybd_event(keys, 0, KEYEVENTF_KEYDOWN, 0); } /// <summary> /// 弹起按键 /// </summary> /// <param name="keys">弹起的键盘的keys枚举</param> public static void PressUpFun(Keys keys) { keybd_event(keys, 0, KEYEVENTF_KEYUP, 0); } /// <summary> /// 按下并弹起一个按键,完整的动作 /// </summary> /// <param name="keys">按键的keys枚举</param> public static void PressFun(Keys keys) { keybd_event(keys, 0, KEYEVENTF_KEYDOWN, 0); keybd_event(keys, 0, KEYEVENTF_KEYUP, 0); } /// <summary> /// 控制鼠标滑轮滚动 /// </summary> /// <param name="distance">滚动的值,负数代表向下,正数代表向上,如-100代表向下滚动100的y坐标</param> public static void ScrollFun(int distance) { //控制鼠标滑轮滚动,count代表滚动的值,负数代表向下,正数代表向上,如-100代表向下滚动100的y坐标 mouse_event(MOUSEEVENTF_WHEEL, 0, 0, distance, 0); } /// <summary> /// 把鼠标移到当前坐标 /// </summary> /// <param name="X">X坐标</param> /// <param name="Y">Y坐标</param> public static void SetCursorPosFun(int X, int Y) { SetCursorPos(X, Y); } /// <summary> /// 鼠标点击一下 /// </summary> /// <param name="mouseButton">鼠标的那个按键点击</param> public static void MouseClickFun(MouseButton mouseButton) { switch (mouseButton) { case MouseButton.left: mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); break; case MouseButton.right: mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); break; case MouseButton.middle: mouse_event(MOUSEEVENTF_MIDDLEDOWN | MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0); break; default: break; } } /// <summary> /// 复制文本到系统剪切板 /// </summary> /// <param name="test">需要复制的文本</param> public static void CopyFun(string test) { int Dwlength = test.Length + 300; int GHND = 2; int hGlobalMenmory = GlobalAlloc(GHND, Dwlength); int lpGlobalMenmory = GlobalLock(hGlobalMenmory); RtlMoveMemory(lpGlobalMenmory, test, Dwlength); GlobalUnlock(hGlobalMenmory); int hwnd = 0; OpenClipboard(hwnd); EmptyClipboard(); const int CF_TEXT = 1; SetClipboardData(CF_TEXT, hGlobalMenmory); CloseClipboard(); } /// <summary> /// 鼠标移动坐标,暂时不用 /// </summary> /// <param name="_x">移动的X</param> /// <param name="_y">移动的Y</param> public static void MouseMoveFun(int _x, int _y) { mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, _x * 65535 / Screen.PrimaryScreen.Bounds.Width, _y * 65535 / Screen.PrimaryScreen.Bounds.Height, 0, 0); //mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, _x , _y, 0, 0); // mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); } } /// <summary> /// 控制类,操作鼠标和键盘需要先实例化此类 /// </summary> public class AutoGui { /// <summary> /// 自动防故障,设置为true时,鼠标坐标为0,0的话,报异常,退出程序 /// </summary> public bool FailSafe { get; set; } /// <summary> /// 构造函数 /// </summary> public AutoGui() { FailSafe = false; } /// <summary> /// 由于win10有缩放功能,所以要转为正常的坐标 /// </summary> /// <param name="pixel">需要转换的值</param> /// <returns>转换之后的值</returns> private double ConvertToNomalCooridate(double pixel) { Graphics g = Graphics.FromHwnd(IntPtr.Zero); float result = g.DpiX; if (result == 0) { return pixel; } return pixel * result / 96; } /// <summary> /// 获得主显示器的宽度和高度 /// </summary> /// <returns>第一个为宽度,第二个为高度</returns> public int[] GetScreenSize() { return new int[] { Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height }; } /// <summary> /// 获得鼠标当前位置 /// </summary> /// <returns>鼠标坐标位置</returns> public System.Drawing.Point Position() { return Control.MousePosition; } /// <summary> /// 鼠标移动到设置的坐标 /// </summary> /// <param name="x">坐标x</param> /// <param name="y">坐标y</param> /// <param name="duration">移动的速度,默认0为瞬间移动过去</param> public void MoveTo(int x, int y, double duration = 0.0) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } //if (duration != 0) //{ // double moveTime = duration * 1000; // System.Drawing.Point point = this.Position(); // int xDis = point.X > x ? point.X : x; // int yDis = point.Y > y ? point.Y : y; // for (int i = 1; i <= moveTime; i = i * (int)moveTime / 100) // { // } //} SetCursorPos(x, y); } /// <summary> /// 鼠标移动到设置的坐标 /// </summary> /// <param name="xyPoint">System.Drawing.Point,里面包含X和Y的值</param> public void MoveTo(System.Drawing.Point xyPoint) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } SetCursorPos(xyPoint.X, xyPoint.Y); } /// <summary> /// 鼠标左键点击一下 /// </summary> public void Click() { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } ControlMouseAndKeyBoard.MouseClickFun(MouseButton.left); } /// <summary> /// 鼠标指针移动到指定坐标,并点击一下 /// </summary> /// <param name="x">坐标x</param> /// <param name="y">坐标y</param> public void Click(int x, int y) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } ControlMouseAndKeyBoard.SetCursorPosFun(x, y); ControlMouseAndKeyBoard.MouseClickFun(MouseButton.left); } /// <summary> /// 鼠标点击一下,需要指定坐标和鼠标的哪个键点击 /// </summary> /// <param name="x">坐标x</param> /// <param name="y">坐标y</param> /// <param name="mouseButton">鼠标的按键</param> public void Click(int x, int y, MouseButton mouseButton) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } ControlMouseAndKeyBoard.SetCursorPosFun(x, y); ControlMouseAndKeyBoard.MouseClickFun(mouseButton); } /// <summary> /// 鼠标左键双击 /// </summary> public void DoubleClick() { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } ControlMouseAndKeyBoard.MouseClickFun(MouseButton.left); ControlMouseAndKeyBoard.MouseClickFun(MouseButton.left); } /// <summary> /// 鼠标左键在指定位置双击 /// </summary> /// <param name="x">坐标x</param> /// <param name="y">坐标y</param> public void DoubleClick(int x, int y) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } ControlMouseAndKeyBoard.SetCursorPosFun(x, y); ControlMouseAndKeyBoard.MouseClickFun(MouseButton.left); ControlMouseAndKeyBoard.MouseClickFun(MouseButton.left); } /// <summary> /// 鼠标双击,需要指定坐标和鼠标的哪个键点击 /// </summary> /// <param name="x">坐标x</param> /// <param name="y">坐标y</param> /// <param name="mouseButton">鼠标的按键</param> public void DoubleClick(int x, int y, MouseButton mouseButton) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } ControlMouseAndKeyBoard.SetCursorPosFun(x, y); ControlMouseAndKeyBoard.MouseClickFun(mouseButton); ControlMouseAndKeyBoard.MouseClickFun(mouseButton); } /// <summary> /// 鼠标滑轮移动 /// </summary> /// <param name="distance">滑轮移动的距离</param> public void Scroll(int distance) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } ControlMouseAndKeyBoard.ScrollFun(distance); } private void SetCursorPos(int x, int y) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } ControlMouseAndKeyBoard.SetCursorPosFun(x, y); } /// <summary> /// 模拟键盘按键 /// </summary> /// <param name="keys">Keys的枚举</param> public void Press(params Keys[] keys) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } for (int i = 0; i < keys.Length; i++) { ControlMouseAndKeyBoard.PressFun(keys[i]); } } /// <summary> /// 模拟键盘按键,按下和抬起一个完整的过程 /// </summary> /// <param name="keys">按键的英文名字</param> public void Press(params string[] keys) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } for (int i = 0; i < keys.Length; i++) { ControlMouseAndKeyBoard.PressFun(StrToKeys(keys[i])); } } /// <summary> /// 按键按下,不弹起 /// </summary> /// <param name="keys"></param> public void KeyDown(params Keys[] keys) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } for (int i = 0; i < keys.Length; i++) { ControlMouseAndKeyBoard.PressDownFun(keys[i]); } } /// <summary> /// 按键按下,不弹起 /// </summary> /// <param name="keys"></param> public void KeyDown(params string[] keys) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } for (int i = 0; i < keys.Length; i++) { ControlMouseAndKeyBoard.PressDownFun(StrToKeys(keys[i])); } } /// <summary> /// 按键弹起 /// </summary> /// <param name="keys"></param> public void KeyUp(params Keys[] keys) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } for (int i = 0; i < keys.Length; i++) { ControlMouseAndKeyBoard.PressUpFun(keys[i]); } } /// <summary> /// 按键弹起 /// </summary> /// <param name="keys"></param> public void KeyUp(params string[] keys) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } for (int i = 0; i < keys.Length; i++) { ControlMouseAndKeyBoard.PressUpFun(StrToKeys(keys[i])); } } /// <summary> /// 快捷键(Keys的枚举),依次传入需要按下的快捷键,例如Ctrl+c /// </summary> /// <param name="keys">Keys的枚举</param> public void HotKey(params Keys[] keys) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } for (int i = 0; i < keys.Length; i++) { ControlMouseAndKeyBoard.PressDownFun(keys[i]); } for (int i = keys.Length - 1; i >= 0; i--) { ControlMouseAndKeyBoard.PressUpFun(keys[i]); } } /// <summary> /// 快捷键(字符串),依次传入需要按下的快捷键,例如Ctrl+c /// </summary> /// <param name="keys">依次按下的按键,需要保证顺序</param> public void HotKey(params string[] keys) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } for (int i = 0; i < keys.Length; i++) { ControlMouseAndKeyBoard.PressDownFun(StrToKeys(keys[i])); } for (int i = keys.Length - 1; i >= 0; i--) { ControlMouseAndKeyBoard.PressUpFun(StrToKeys(keys[i])); } } /// <summary> /// 将本文复制到系统的剪切板中 /// </summary> /// <param name="test">需要复制的信息</param> public void Copy(string test) { ControlMouseAndKeyBoard.CopyFun(test); } /// <summary> /// 在光标位置发送信息,类似窗口的需要先点击一下,再使用此函数 /// </summary> /// <param name="test">需要发送的文本</param> public void SendTest(string test) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } ControlMouseAndKeyBoard.CopyFun(test); this.HotKey(Keys.ControlKey, Keys.V); } /// <summary> /// 获得Location的中心坐标值,返回一个Point /// </summary> /// <param name="location">需要提取中心的Location</param> /// <returns></returns> public System.Drawing.Point Center(Location location) { return new System.Drawing.Point(location.centerX, location.centerY); } /// <summary> /// 传入截图,获得图片在屏幕中的位置信息 /// </summary> /// <param name="imgPath">截图的地址</param> /// <param name="threshold">相似度,默认为1,建议为0.9</param> /// <returns>坐标信息的结构体</returns> public Location LocateOnScreen(string imgPath, double threshold = 1) { //防故障检测 if (this.FailSafe && this.Position().X == 0 && this.Position().Y == 0) { throw new MyException("异常:防故障处理"); } //创建图象,保存将来截取的图象 Bitmap imgSrc = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); Graphics imgGraphics = Graphics.FromImage(imgSrc); //设置截屏区域 imgGraphics.CopyFromScreen(0, 0, 0, 0, new System.Drawing.Size((int)ConvertToNomalCooridate(Screen.PrimaryScreen.Bounds.Width), (int)ConvertToNomalCooridate(Screen.PrimaryScreen.Bounds.Height))); //寻找位置的图片 Bitmap imgSub = new Bitmap(imgPath); OpenCvSharp.Mat srcMat = null; OpenCvSharp.Mat dstMat = null; OpenCvSharp.OutputArray outArray = null; try { srcMat = imgSrc.ToMat(); dstMat = imgSub.ToMat(); outArray = OpenCvSharp.OutputArray.Create(srcMat); //开始匹配 OpenCvSharp.Cv2.MatchTemplate(srcMat, dstMat, outArray, TemplateMatchModes.CCoeffNormed); double minValue, maxValue; OpenCvSharp.Point location, point; OpenCvSharp.Cv2.MinMaxLoc(OpenCvSharp.InputArray.Create(outArray.GetMat()), out minValue, out maxValue, out location, out point); if (maxValue >= threshold) { return new Location(point.X, point.Y, point.X + imgSub.Width, point.Y + imgSub.Height, point.X + imgSub.Width / 2, point.Y + imgSub.Height / 2); } return new Location(); } catch { return new Location(); } finally { if (imgSrc != null) imgSrc.Dispose(); if (imgGraphics != null) imgGraphics.Dispose(); if (imgSub != null) imgSub.Dispose(); if (srcMat != null) srcMat.Dispose(); if (dstMat != null) dstMat.Dispose(); if (outArray != null) outArray.Dispose(); } } private Keys StrToKeys(string key) { key = key.ToUpper(); switch (key) { case "A": return Keys.A; case "B": return Keys.B; case "C": return Keys.C; case "D": return Keys.D; case "E": return Keys.E; case "F": return Keys.F; case "G": return Keys.G; case "H": return Keys.J; case "I": return Keys.I; case "J": return Keys.J; case "K": return Keys.K; case "L": return Keys.L; case "M": return Keys.M; case "N": return Keys.N; case "O": return Keys.O; case "P": return Keys.P; case "Q": return Keys.Q; case "R": return Keys.R; case "S": return Keys.S; case "T": return Keys.T; case "U": return Keys.U; case "V": return Keys.V; case "W": return Keys.W; case "X": return Keys.X; case "Y": return Keys.Y; case "Z": return Keys.Z; case "+": return Keys.Add; case "*": return Keys.Multiply; case "-": return Keys.Subtract; case "/": return Keys.Divide; case "F1": return Keys.F1; case "F2": return Keys.F2; case "F3": return Keys.F3; case "F4": return Keys.F4; case "F5": return Keys.F5; case "F6": return Keys.F6; case "F7": return Keys.F7; case "F8": return Keys.F8; case "F9": return Keys.F9; case "F10": return Keys.F10; case "F11": return Keys.F11; case "F12": return Keys.F12; case "CTRL": return Keys.Control; case "ALT": return Keys.Alt; case "SHIFT": return Keys.Shift; case "LSHIFT": return Keys.LShiftKey; case "RSHIFT": return Keys.RShiftKey; case "CTRLKEY": return Keys.ControlKey; case "SHIFTKEY": return Keys.ShiftKey; case "TAB": return Keys.Tab; case "CAPSLOCK": return Keys.CapsLock; case "UP": return Keys.Up; case "DOWN": return Keys.Down; case "LEFT": return Keys.Left; case "RIGHT": return Keys.Right; case "BAKE": return Keys.Back; case "BAKESPACE": return Keys.Back; case "ESC": return Keys.Escape; case "ENTER": return Keys.Enter; case "LCTRLKEY": return Keys.LControlKey; case "RCTRLKEY": return Keys.RControlKey; case "PAGEDOWN": return Keys.PageDown; case "PAGEUP": return Keys.PageUp; case "DELETE": return Keys.Delete; case "HOME": return Keys.Home; case "END": return Keys.End; case "INSERT": return Keys.Insert; case "PRINTSCREEN": return Keys.PrintScreen; case "JIETU": return Keys.PrintScreen; case "SCROLLLOCK": return Keys.Scroll; case "PAUSE": return Keys.Pause; case "NUMLOCK": return Keys.NumLock; case "0": return Keys.D0; case "1": return Keys.D1; case "2": return Keys.D2; case "3": return Keys.D3; case "4": return Keys.D4; case "5": return Keys.D5; case "6": return Keys.D6; case "7": return Keys.D7; case "8": return Keys.D8; case "9": return Keys.D9; case "N0": return Keys.NumPad0; case "N1": return Keys.NumPad1; case "N2": return Keys.NumPad2; case "N3": return Keys.NumPad3; case "N4": return Keys.NumPad4; case "N5": return Keys.NumPad5; case "N6": return Keys.NumPad6; case "N7": return Keys.NumPad7; case "N8": return Keys.NumPad8; case "N9": return Keys.NumPad9; case ".": return Keys.Decimal; case ";": return Keys.OemSemicolon; case "WIN": return Keys.LWin; case "LWIN": return Keys.LWin; case "RWIN": return Keys.RWin; case "~": return Keys.Oemtilde; case "(": return Keys.OemOpenBrackets; case ")": return Keys.OemCloseBrackets; case "'": return Keys.OemQuotes; case "\"": return Keys.OemQuotes; case "\\": return Keys.OemBackslash; default: return Keys.None; } } } }
下面是根据水哥自动化写的
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using CsAutoGui; namespace 懒人自动化 { public class CsJiaoBen { private CsAutoGui.AutoGui autoGui; private List<string[]> allDatas; public int sleepTime; public string conFilePath; public CsJiaoBen(string conPath) { this.conFilePath = conPath; sleepTime = 0; autoGui = new AutoGui(); autoGui.FailSafe = true; allDatas = new List<string[]>(); string[] datas = File.ReadAllLines(this.conFilePath, Encoding.UTF8); for (int i = 0; i < datas.Length; i++) { if (!datas[i].StartsWith("#")) { allDatas.Add(datas[i].Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries)); } } } public CsJiaoBen(string[] datas) { this.conFilePath = ""; sleepTime = 0; autoGui = new AutoGui(); autoGui.FailSafe = true; allDatas = new List<string[]>(); for (int i = 0; i < datas.Length; i++) { if (!datas[i].StartsWith("#")) { allDatas.Add(datas[i].Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries)); } } } public void Start() { for (int i = 0; i < allDatas.Count; i++) { Step(allDatas[i]); if (sleepTime!=0) { Thread.Sleep(sleepTime); } } } public void Copy(string test) { autoGui.Copy(test); } void Step(string[] data) { //0移动过去,不点击 if (data[0] == "0"|| data[0] == "移动") { while (true) { Location location = autoGui.LocateOnScreen(data[1], 0.9); if (location.IsNull()==false) { autoGui.MoveTo(autoGui.Center(location).X, autoGui.Center(location).Y); return; } Thread.Sleep(200); } } //1单击左键 else if (data[0] == "1"||data[0] == "单击") { while (true) { Location location = autoGui.LocateOnScreen(data[1], 0.9); if (location.IsNull() == false) { autoGui.MoveTo(autoGui.Center(location).X, autoGui.Center(location).Y); // Thread.Sleep(100); autoGui.Click(); return; } Thread.Sleep(200); } } //2双击左键 else if (data[0] == "2"|| data[0] == "双击") { while (true) { Location location = autoGui.LocateOnScreen(data[1], 0.9); if (location.IsNull() == false) { autoGui.DoubleClick(autoGui.Center(location).X, autoGui.Center(location).Y, MouseButton.left); Thread.Sleep(100); return; } Thread.Sleep(200); } } //3单击右键 else if (data[0] == "3"|| data[0] == "右键") { while (true) { Location location = autoGui.LocateOnScreen(data[1], 0.9); if (location.IsNull() == false) { autoGui.DoubleClick(autoGui.Center(location).X, autoGui.Center(location).Y, MouseButton.right); return; } Thread.Sleep(200); } } //4输入内容 else if (data[0] == "4"|| data[0] == "输入") { autoGui.SendTest(data[1]); return; } //5等待延迟 else if (data[0] == "5" || data[0] == "等待") { Thread.Sleep(int.Parse(data[1])); return; } //6滚轮 else if (data[0] == "6" || data[0] == "滚轮") { autoGui.Scroll(int.Parse(data[1])); return; } //7按键 else if (data[0] == "7" || data[0] == "按键") { string[] buttons = data[1].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); autoGui.Press(buttons); return; } //8热键 else if (data[0] == "8"||data[0] == "组合键") { string[] buttons = data[1].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); autoGui.HotKey(buttons); return; } else { return; } } } }