使用 CEF devtools ExecuteDevToolsMethodAsync 和 Page.captureScreenshot 时消息 ID 出错
message id went wrong when using CEF devtools ExecuteDevToolsMethodAsync and Page.captureScreenshot
我已将 CEF 控件添加到 WinForm 中。并且我添加了一个 invokeCapture
方法,该方法有望捕获 CEF 整个页面的屏幕截图。第一次调用时它工作正常。但是自第二次调用以来遇到了错误,消息是“Generated MessageID 100002 doesn't match returned Message Id 100001”。如何多次捕获屏幕截图?
我已经将https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Example/DevTools/DevToolsExtensions.cs中的截图功能代码复制到我的项目中,并将其命名空间重命名为winformcefdemo.CefSharp.Example
。
classDevToolsClient
的变量lastMessageId
,其中classCaptureScreenshot
执行ExecuteDevToolsMethodAsync
是为了运行 命令“Page.CaptureScreenshot”是私有的,没有 getter 也没有 setter。这似乎很烦人。方法 ExecuteDevToolsMethodAsync
想要将方法 ExecuteDevToolsMethod
returns 的消息 ID 与 DevToolsClient
本身自动增加的消息 ID 进行比较。方法CaptureScreenShotAsPng
中的DevtoolsClient
就是browser.GetDevToolsClient()
returns(在上面link的第36行)。而且我还检查了方法 GetDevToolsClient
的实现。它也在 CefSharp.DevToolsExtensions
.
中使用 DevToolsClient devToolsClient = new DevToolsClient(browser);
private async void invokeCapture()
{
try
{
byte[] result = await winformcefdemo.CefSharp.Example.DevTools.DevToolsExtensions.CaptureScreenShotAsPng(browser);
// task.Start();
// byte[] result = task.Result;
SaveFileDialog dialog = new SaveFileDialog();
DialogResult dresult = dialog.ShowDialog();
if (dresult == DialogResult.OK)
{
string path = dialog.FileName;
try
{
File.WriteAllBytes(path, result);
MessageBox.Show(path + " saved success");
} catch (Exception e)
{
MessageBox.Show(path + "Unknown error occurred when saving to file: " + e.Message);
}
}
}
catch (Exception ee)
{
MessageBox.Show("Unknown error occurred when capturing: " + ee.Message);
}
}
CSDN中文社区已解决
不使用DevToolsExtensions
。使用 PageClient
代替。 DevToolsExtensions
确实有问题没有解决。
并且 PageClient
应该全局定义。不要在方法中定义它。
# Source: https://bbs.csdn.net/topics/398544662
CefSharp.DevTools.Page.PageClient pageClien= null;
private async void invokeCapture()
{
if(pageClien==null)
{
pageClien = webBrowser.GetBrowser().GetDevToolsClient().Page;
}
var result = await pageClien.CaptureScreenshotAsync();
if (result.Data != null)
{
MemoryStream ms = new MemoryStream(result.Data);
ms.Write(result.Data, 0, result.Data.Length);
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "PNG Picture (*.PNG)|*.PNG";
DialogResult dresult = dialog.ShowDialog();
if (dresult == DialogResult.OK)
{
string path = dialog.FileName;
try
{
File.WriteAllBytes(path, result);
MessageBox.Show(path + " saved success");
} catch (Exception e)
{
MessageBox.Show(path + "Unknown error occurred when saving to file: " + e.Message);
}
}
}
}
我已将 CEF 控件添加到 WinForm 中。并且我添加了一个 invokeCapture
方法,该方法有望捕获 CEF 整个页面的屏幕截图。第一次调用时它工作正常。但是自第二次调用以来遇到了错误,消息是“Generated MessageID 100002 doesn't match returned Message Id 100001”。如何多次捕获屏幕截图?
我已经将https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Example/DevTools/DevToolsExtensions.cs中的截图功能代码复制到我的项目中,并将其命名空间重命名为winformcefdemo.CefSharp.Example
。
classDevToolsClient
的变量lastMessageId
,其中classCaptureScreenshot
执行ExecuteDevToolsMethodAsync
是为了运行 命令“Page.CaptureScreenshot”是私有的,没有 getter 也没有 setter。这似乎很烦人。方法 ExecuteDevToolsMethodAsync
想要将方法 ExecuteDevToolsMethod
returns 的消息 ID 与 DevToolsClient
本身自动增加的消息 ID 进行比较。方法CaptureScreenShotAsPng
中的DevtoolsClient
就是browser.GetDevToolsClient()
returns(在上面link的第36行)。而且我还检查了方法 GetDevToolsClient
的实现。它也在 CefSharp.DevToolsExtensions
.
DevToolsClient devToolsClient = new DevToolsClient(browser);
private async void invokeCapture()
{
try
{
byte[] result = await winformcefdemo.CefSharp.Example.DevTools.DevToolsExtensions.CaptureScreenShotAsPng(browser);
// task.Start();
// byte[] result = task.Result;
SaveFileDialog dialog = new SaveFileDialog();
DialogResult dresult = dialog.ShowDialog();
if (dresult == DialogResult.OK)
{
string path = dialog.FileName;
try
{
File.WriteAllBytes(path, result);
MessageBox.Show(path + " saved success");
} catch (Exception e)
{
MessageBox.Show(path + "Unknown error occurred when saving to file: " + e.Message);
}
}
}
catch (Exception ee)
{
MessageBox.Show("Unknown error occurred when capturing: " + ee.Message);
}
}
CSDN中文社区已解决
不使用DevToolsExtensions
。使用 PageClient
代替。 DevToolsExtensions
确实有问题没有解决。
并且 PageClient
应该全局定义。不要在方法中定义它。
# Source: https://bbs.csdn.net/topics/398544662
CefSharp.DevTools.Page.PageClient pageClien= null;
private async void invokeCapture()
{
if(pageClien==null)
{
pageClien = webBrowser.GetBrowser().GetDevToolsClient().Page;
}
var result = await pageClien.CaptureScreenshotAsync();
if (result.Data != null)
{
MemoryStream ms = new MemoryStream(result.Data);
ms.Write(result.Data, 0, result.Data.Length);
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "PNG Picture (*.PNG)|*.PNG";
DialogResult dresult = dialog.ShowDialog();
if (dresult == DialogResult.OK)
{
string path = dialog.FileName;
try
{
File.WriteAllBytes(path, result);
MessageBox.Show(path + " saved success");
} catch (Exception e)
{
MessageBox.Show(path + "Unknown error occurred when saving to file: " + e.Message);
}
}
}
}