编程语言
首页 > 编程语言> > C#的AutoGui,功能类似Python的pyautogui

C#的AutoGui,功能类似Python的pyautogui

作者:互联网

    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;
            }
        }
    }
}

标签:pyautogui,case,return,Python,Keys,int,&&,public,C#
来源: https://blog.csdn.net/qq_42190219/article/details/122815966