c# - 如何解决 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
解决方案
推荐阅读
- python - 在 Pygame 中 n 秒后将间隔减少 n
- powershell - iTextSharp 5 AcroFields [PowerShell] 中的“丢失”字形
- php - 添加特定月份的记录
- mysql - 更新级联上的Mysql不适用于树表
- python - 当你在不同的形状上使用 tensorflow.keras.layers.Add 会发生什么?
- ssl - 如何从 Insomnia REST Client 创建 SSL 密钥日志?
- ruby - 使用 RSpec 生成不泄漏的动态测试的最佳方法(LeakyConstantDeclaration 问题)?
- npm - React-snap 无法抓取 pdf 文件?
- android - Xamarin Android 应用程序永远不会完全卸载
- python - 在 SQLAlchemy 中查询 SQL Server JSON