21.01.18更新:CSDNフォーラムの大物が解決策を提供しました。スクリーンショットを複数回呼び出すことができます。参考までにこちらにも掲載しています。
これは、グローバル変数を使用してPageClient
ページオブジェクトを一時的に保存するように変更されています。この定義ステートメントをメソッドに配置すると、「生成されたメッセージID100002が返されたメッセージID100001と一致しません」というエラーが報告されるため、グローバル変数に配置する必要があります。
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图片 (*.PNG)|*.PNG";
DialogResult dresult = dialog.ShowDialog();
if (dresult == DialogResult.OK)
{
string path = dialog.FileName;
try
{
File.WriteAllBytes(path, result.Data);
MessageBox.Show(path + "保存成功。");
}
catch (Exception e)
{
MessageBox.Show(path + "保存失败!错误信息:" + e.Message);
}
}
}
}
これの利点の1つは、Win32低レベルAPIを呼び出す必要がないことです。CEFコンポーネントメソッドを直接使用してスクリーンショットを撮ることができ、OffScreen
コンポーネント全体を専用にする必要はありません。結局のところ、コピーして継承する必要があり、メモリも消費します。また、CEFウィンドウが画面を超えたり、他のウィンドウによってブロックされたり、特別な手段を使用してウィンドウを画面よりも大きい解像度に拡大したりした場合でも、この方法は傍受される可能性があります。
ただし、この方法ではスクリーンショットを1回しか撮ることができず、複数回撮ることはできません。スクリーンショットを続行するには、終了して再起動する必要があります。2番目のスクリーンショットは、「生成されたメッセージID100002が返されたメッセージID100001と一致しません」というエラーを報告します。外国のコミュニティを含め、オンラインで解決策はありません。私はすでにStackOverflowでこの質問をしました。
コードhttps://github.com/cefsharp/CefSharp/blob/master/CefSharp.Example/DevTools/DevToolsExtensions.csをGithubにコピーし、プロジェクトに配置して、名前空間を変更します。次に、CEFコントロールを直接呼び出すことができます。ここでは、WinFormによって表示されるGUIが使用されます。次に、コードにメソッドを記述して呼び出します。
private async void invokeCapture()
{
try
{
byte[] result = await CefSharp.Example.DevTools.DevToolsExtensions.CaptureScreenShotAsPng(browser); // browser是CEF控件实例
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "PNG图片 (*.PNG)|*.PNG";
DialogResult dresult = dialog.ShowDialog();
if (dresult == DialogResult.OK)
{
string path = dialog.FileName;
try
{
File.WriteAllBytes(path, result);
MessageBox.Show(path + "保存成功。");
} catch (Exception e)
{
MessageBox.Show(path + "保存失败!错误信息:" + e.Message);
}
}
}
catch (Exception ee)
{
MessageBox.Show("目前暂时只支持截一次图,暂时不支持截更多次数的图片,如果要继续截图得退出程序重开。作者确实没法解决这个问题了,谁有好的想法也欢迎提出来,具体详情请关注https://stackoverflow.com/questions/65334430/message-id-went-wrong-when-using-cef-devtools-executedevtoolsmethodasync-and-pag 。相关技术细节:" + ee.Message, "暂不支持的操作", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}