首页 > 解决方案 > 如何解决 C# 中 ChromiumWebBrowser 的滞后问题?

问题描述

我有一个用于虚拟桌面的 Windows 窗体应用程序,它也必须由 AI 使用。虚拟桌面是一个带有一些 JS 的简单 HTML 页面。我需要定期对桌面进行截图。CefSharp.WinForm 的 ChromiumWebBrowser 没有实现它,这与 CefSharp.OffScreen 不同,所以我使用了 OffScreen Web 浏览器和图片框来显示 Web 浏览器的图像。图像由每 10 毫秒计时一次的计时器捕获。这是执行屏幕截图并在图片框中替换它的功能:

private void save(string path, Bitmap bmp)
    {
        using (MemoryStream memory = new MemoryStream())
        {
            using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite))
            {
                bmp.Save(memory, ImageFormat.Png);
                byte[] bytes = memory.ToArray();
                fs.Write(bytes, 0, bytes.Length);
            }
        }
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        Bitmap bmp1 = null;
        await chromeBrowser2.ScreenshotAsync().ContinueWith(
            async (task) =>
            {
                bmp1 = task.Result;
                GC.Collect();
                GC.WaitForPendingFinalizers();
            });
        if (bmp1 == null)
        {
            return;
        }

        if (pictureBox3.Image != null) pictureBox3.Image.Dispose();
        pictureBox3.Image = bmp1.Clone(
            new Rectangle(0, 0, bmp1.Width, bmp1.Height),
            System.Drawing.Imaging.PixelFormat.DontCare);
        save("C:\\Management/Finale.png", bmp1);
        bmp1.Dispose();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        button1_Click(sender, e);

    }

我使用以下代码将图片框上的鼠标事件重定向到 ChromiumWebBrowser:

CefSharp.MouseEvent mouseEventt;
    private void pictureBox3_MouseMove(object sender, MouseEventArgs e)
    {

        mouseEventt = new MouseEvent(e.X, e.Y, CefEventFlags.None);
        pictureBox2.Location = new Point(System.Windows.Forms.Cursor.Position.X + 1, System.Windows.Forms.Cursor.Position.Y + 1);

        chromeBrowser2.GetBrowser().GetHost().SendMouseMoveEvent(mouseEventt, false);

    }


    bool test = false;
    private void pictureBox3_MouseDown(object sender, MouseEventArgs e)
    {
        if(e.Button == MouseButtons.Left && test == false)
        {
            test = true;
            chromeBrowser2.GetBrowser().GetHost().SendMouseClickEvent(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y, MouseButtonType.Left, false, 1, CefEventFlags.LeftMouseButton);
            System.Threading.Thread.Sleep(25);
        }


        if(e.Button == MouseButtons.Left && e.Clicks == 2)
        {
            test = true;
            chromeBrowser2.GetBrowser().GetHost().SendMouseClickEvent(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y, MouseButtonType.Left, false, 2, CefEventFlags.LeftMouseButton);
            System.Threading.Thread.Sleep(25);
        }

    }

    private void pictureBox3_MouseUp(object sender, MouseEventArgs e)
    {
        if ( test == true)
        {
            test = false;
            chromeBrowser2.GetBrowser().GetHost().SendMouseClickEvent(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y, MouseButtonType.Left, true, 1, CefEventFlags.LeftMouseButton);
            System.Threading.Thread.Sleep(25);
        }
    }

此处的代码有效,但会导致滞后效应。我做错了什么?感谢支持 :D

标签: c#winformschromium

解决方案


推荐阅读