C#(CSharp)用CefSharp开发浏览器--鼠标模拟,自动点击,鼠标移动,鼠标事件

C# CSharp用CefSharp开发浏览器--鼠标模拟,自动点击,鼠标移动,鼠标事件

  • 效果:模拟鼠标点击、移动,自动画线。
  • 开发环境
  • 方案
  • 一个坑
  • 代码

效果:模拟鼠标点击、移动,自动画线。

研究 网络爬虫和一些 验证码破解(人类行为检测) 时候,需要 自动 鼠标点击,鼠标移动等。初步找到个满意的方案,写了个案例。

WinForm程序 内嵌浏览器。并在某在线画图网站上,模拟鼠标 点击,移动,画线。

C#(CSharp)用CefSharp开发浏览器--鼠标模拟,自动点击,鼠标移动,鼠标事件_第1张图片

开发环境

vs2015 + .Net framework 4.5.2 + x64 + CefSharp 71.0.0( CefSharp.Common 71.0.0 +CefSharp.WinForms 71.0.0)

程序是在CefSharp的开源案例(CefSharp.MinimalExample)上修改而来。
https://github.com/cefsharp/CefSharp.MinimalExample

也可以用 Nuget获得 CefSharp
https://www.nuget.org/packages/CefSharp.WinForms/
https://www.nuget.org/packages/CefSharp.Common/

方案

查了一下午资料。度娘很残念,头几条广告不说,前几页内容还重复,越往后几页更不知道是什么鬼内容。Bing搜索,前几页和 度娘差不多内容。。没有什么好的答案。
基本是:

  • 第一种。向页面 插入JavaScript代码,用JavaScript函数进行操作。
  • 第二种。用Win32 API 模拟发送 windows系统 鼠标事件。

不甚满意。
CefCharp是Chrome的开源浏览器做内核,既然是开源浏览器。不应当用这么别扭的,绕弯的方式实现。
继续研究,查资料。

后来只能翻翻 CarSharp 的源码讨论贴。英文看着挺吃力。还在源码里搜关键字。mouse,click之类。

后来也不记得哪里发现的。总之源码(CefCharp)里有这类函数:
SendMouseClickEvent
SendMouseMoveEvent

后面就是写个案例了。

一个坑

SendMouseWheelEvent 是鼠标滚轮,滚动。

void SendMouseWheelEvent(MouseEvent mouseEvent, int deltaX, int deltaY);

想实现 向下滚动 网页。

deltaY 设置 200 没反应。设500 没反应。设 50 没反应。
检查来 检查去,好几边,没发现哪里有错误。

偶然把页面滚到底部。结果 这货自动滚上去了。滚上去了。上去了。
NMD deltaY 要设 负数。后来一想。鼠标事件里,deltaY这个量 应该是滚轮 滚动量,并不是 页面或者屏幕的坐标量。坐标系不同啊

代码

namespace CefSharp.MinimalExample.WinForms
{
	//官方的开源案例
    public partial class BrowserForm : Form
    {
      private readonly ChromiumWebBrowser browser;//CefSharp浏览器
     
        public BrowserForm()
        {
            InitializeComponent();

            Text = "CefSharp";
            WindowState = FormWindowState.Maximized;

            //在线画板 http://www.atool.org/canvas.php
            browser = new ChromiumWebBrowser("http://www.atool.org/canvas.php")
            {
                Dock = DockStyle.Fill,
            };            
    	//......略
        //......略
        //......略
		void ShowLabel(string msg)
        {
            System.Diagnostics.Debug.WriteLine(msg);
            this.InvokeOnUiThreadIfRequired(() => label1.Text = msg);
        }
        //画线。鼠标左键按下,移动,移动...左键抬起。
        public void CefMouseDrawLine(int x1, int y1, int x2, int y2)
        {
            //Task.Run(() =>
            //{
            ShowLabel("------------start");
            var host = browser.GetBrowser().GetHost();

            host.SendMouseClickEvent(x1, y1, MouseButtonType.Left, false, 1, CefEventFlags.None);//按下鼠标左键
            Thread.Sleep(3);
            double x = x1;
            double y = y1;
            int xlen = x2 - x1;
            int ylen = y2 - y1;
            double xs = 1;
            double ys = 1;

            int z = (int)Math.Sqrt(xlen * xlen + ylen * ylen);
            xs = (double)xlen / (double)z;
            ys = (double)ylen / (double)z;

            for (int i = 1; i < z; i++)
            {
                x = (x + xs);
                y = (y + ys);
                ShowLabel("x=" + x + ",y=" + y);
                Thread.Sleep(3);
                host.SendMouseMoveEvent((int)x, (int)y, false, CefEventFlags.LeftMouseButton);//移动鼠标
            }
            Thread.Sleep(3);
            host.SendMouseClickEvent(x2, y2, MouseButtonType.Left, true, 1, CefEventFlags.None);//抬起鼠标左键
            ShowLabel("------------end");
            //});
        }

		//菜单事件
        private void drawLineToolStripMenuItem_Click(object sender, EventArgs e)
        {
            browser.Focus();


            Task.Run(() =>//多线程
            {
                ShowLabel("task run start");

                int x = browser.Width / 2;
                int y = browser.Height / 2;
                y -= 50;
                x -= 30;

                int x2 = x + 50;
                int y2 = y + 80;
                string msg = string.Format("x1={0},y1={1},x2={2},y2={3},W={4},H={5}", x, y, x2, y2, browser.Width, browser.Height);
                ShowLabel(msg);
                //MessageBox.Show(msg);
                CefMouseDrawLine(x, y, x2, y2);//第一条线

                x = x2;
                y = y2;
                x2 = x + 100;
                y2 = y - 20;
                CefMouseDrawLine(x, y, x2, y2);//第二条线
            });
        }
        

你可能感兴趣的:(C#学习,浏览器,网络爬虫)