C#(CSharp)用CefSharp開發瀏覽器--鼠標模擬,自動點擊,鼠標移動,鼠標事件

C# CSharp用CefSharp開發瀏覽器--鼠標模擬,自動點擊,鼠標移動,鼠標事件

效果:模擬鼠標點擊、移動,自動畫線。

研究 網絡爬蟲和一些 驗證碼破解(人類行爲檢測) 時候,需要 自動 鼠標點擊,鼠標移動等。初步找到個滿意的方案,寫了個案例。

WinForm程序 內嵌瀏覽器。並在某在線畫圖網站上,模擬鼠標 點擊,移動,畫線。

自動畫線

開發環境

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);//第二條線
            });
        }
        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章