.Net工具类(二).鼠标操作类

.Net工具类(二).鼠标操作类

在一些特殊情况中需要用到鼠标操作,比如网站反爬机制中添加鼠标滑动监听事件或鼠标点击验证码等来进行人机验证,为了突破反爬限制,需要模拟鼠标操作,会用到此工具类。

  public class Win32Helper
    {
        //设置鼠标位置
        [DllImport("user32.dll")]
        public static extern bool SetCursorPos(int X, int Y);

        //设置鼠标按键和动作
        [DllImport("user32.dll")]
        public static extern void mouse_event(MouseEventFlag flags, int dx, int dy,
            uint data, UIntPtr extraInfo); //UIntPtr指针多句柄类型

     
        /// <summary>
        /// 模拟鼠标滑动
        /// </summary>
        /// <param name="start">开始未知</param>
        /// <param name="end">结束未知</param>
        /// <param name="second">总耗时(秒)</param>
        /// <param name="delay">每次视觉延迟(毫秒)</param>
        public static void SlideMouse(Point start, Point end, int second, int delay = 200)
        {
            var cycle = second * 1000 / delay;
            var xSpeed = Math.Abs(end.X - start.X) / cycle;
            var ySpeed = Math.Abs(end.Y - start.Y) / cycle;
            var x = start.X;
            var y = start.Y;
            SetCursorPos(x, y);
            for (int i = 0; i < cycle; i++)
            {
                x = end.X > start.X ? x + xSpeed : x - xSpeed;
                y = end.Y > start.Y ? y + ySpeed : y - ySpeed;
                SetCursorPos(x, y);
                Thread.Sleep(TimeSpan.FromMilliseconds(delay));
            }
            x = end.X;
            y = end.Y;
            SetCursorPos(x, y);
        }

        /// <summary>
        /// 随机鼠标滑动
        /// </summary>
        /// <param name="maxWidth"></param>
        /// <param name="maxHeight"></param>
        public static void RandomSlideMouse(int maxWidth, int maxHeight, int time)
        {
            var random = new Random();
            for (int i = 0; i < time; i++)
            {
                var startPoint = new Point(random.Next(0, maxWidth), random.Next(0, maxHeight));
                var endpoint = new Point(random.Next(0, maxWidth), random.Next(0, maxHeight));
                SlideMouse(startPoint, endpoint, 2);
            }
        }

    }

    //结构体布局 本机位置
    [StructLayout(LayoutKind.Sequential)]
    public struct NativeRECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }

    //将枚举作为位域处理
    [Flags]
    public enum MouseEventFlag : uint //设置鼠标动作的键值
    {
        Move = 0x0001,               //发生移动
        LeftDown = 0x0002,           //鼠标按下左键
        LeftUp = 0x0004,             //鼠标松开左键
        RightDown = 0x0008,          //鼠标按下右键
        RightUp = 0x0010,            //鼠标松开右键
        MiddleDown = 0x0020,         //鼠标按下中键
        MiddleUp = 0x0040,           //鼠标松开中键
        XDown = 0x0080,
        XUp = 0x0100,
        Wheel = 0x0800,              //鼠标轮被移动
        VirtualDesk = 0x4000,        //虚拟桌面
        Absolute = 0x8000
    }
posted @ 2022-03-16 18:25  热烈的少年  阅读(123)  评论(0)    收藏  举报