CefSharp关闭一个窗口的问题

为轮子而生 2018-08-02 09:16:55
因.Net版本问题,仅能使用CefSharp.WinForms 40~49之间的版本。
现在需要在同一进程中开启多个浏览器窗口时,关闭其中的一个,考虑过以下方法:

1、Cef.Shutdown(),这个是肯定不行的,调用后整个程序都会退出
2、调用目标ChromiumWebBrowser控件的Dispose方法,即 browser.Dispose()与方法1的效果完全一样
3、browser.Hide(),只是这样隐藏的话,如果网页有声音,是会持续播放的,Stop()方法也不会有用
4、现在使用的是 browser.Load("about:blank"); browser.Hide(); 组合的方法,自己也感觉很LOW,而且这样开过的网页会在进程中驻留,时间一长会有大量CefSharp.BrowserSubprocess.exe存在(主动杀进程的方法感觉更是不合理的)

有没有办法能彻底关闭其中的一个浏览器窗口,而不会有其它负面影响呢?

...全文
3326 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
认真的coder 2020-09-04
  • 打赏
  • 举报
回复 1
引用 1 楼 StratosBlue 的回复:
测试了一下,用的net461,cef版本49.0.0。。大概是这样操作的。。 先获取ChromiumWebBrowser的Browser,然后再关闭Browser;即 browser.GetBrowser().CloseBrowser(false); 另外测试的时候使用的TabControl,如果没有显式释放TabPage的话,在窗口切换后会出现异常,即需要显式调用ChromiumWebBrowser对象父控件的Dispose方法。 仅供参考
使用这个方法,browser.GetBrowser().CloseBrowser(false); 同样会退出主程序。 又是为什么呢? 求助?
flyto2k 2020-04-23
  • 打赏
  • 举报
回复
@为轮子而生,请教下cefsharp 63版 动态生成的带文字的pdf文件为何不能显示,如何解决,49版的正常。
为轮子而生 2020-02-25
  • 打赏
  • 举报
回复
引用 3 楼 tangdodo 的回复:
想知道wpf的中文输入法有解决办法了吗?网上的试了一下都不能用,也不知道怎么回事
如果只是popup的输入法有问题,可参考以下代码,实测可行:

public class Popup
{

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern int SetWindowPos(IntPtr hwnd, int hwndInsertAfter, int x, int y, int width, int height, int flags);
    [DllImport("user32.dll")]
    private static extern int GetWindowRect(int hwnd, ref RECT lpRect);
    [DllImport("user32.dll")]
    private static extern IntPtr SetActiveWindow(IntPtr hwnd);

    private struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    private static void Optimize(Primitives.Popup popup)
    {

        var hwnd = ((HwndSource)PresentationSource.FromVisual(popup.Child)).Handle;

        RECT rect = default(RECT);
        int r = GetWindowRect((int)hwnd, ref rect);
        if (r == 0) return;

        double Width = !double.IsNaN(popup.Width) && popup.Width > 0 ? popup.Width : popup.ActualWidth;
        double Height = !double.IsNaN(popup.Height) && popup.Height > 0 ? popup.Height : popup.ActualHeight;

        SetWindowPos(hwnd, -1, rect.Left, rect.Top, (int)Width, (int)Height, 0);

    }

    private static List<int> instances = new List<int>();

    public static void AutoRender()
    {
        EventManager.RegisterClassHandler(typeof(Primitives.Popup), Primitives.Popup.PreviewGotKeyboardFocusEvent, new KeyboardFocusChangedEventHandler(OnPreviewGotKeyboardFocus), true);
    }

    private static void OnPreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {

        try
        {

            var textBox = e.NewFocus as TextBoxBase;
            if (textBox == null) return;

            IntPtr hwnd = ((HwndSource)PresentationSource.FromVisual(textBox)).Handle;
            if (hwnd != IntPtr.Zero && !instances.Contains(hwnd.ToInt32()))
            {
                instances.Add(hwnd.ToInt32());
                SetActiveWindow(hwnd);
            }

        }
        catch (Exception) { }
            
    }

}
除popup外,暂未发现有输入法问题
tangdodo 2020-02-23
  • 打赏
  • 举报
回复
想知道wpf的中文输入法有解决办法了吗?网上的试了一下都不能用,也不知道怎么回事
为轮子而生 2018-08-05
  • 打赏
  • 举报
回复
引用 1 楼 StratosBlue 的回复:
测试了一下,用的net461,cef版本49.0.0。。大概是这样操作的。。 先获取ChromiumWebBrowser的Browser,然后再关闭Browser;即 browser.GetBrowser().CloseBrowser(false); 另外测试的时候使用的TabControl,如果没有显式释放TabPage的话,在窗口切换后会出现异常,即需要显式调用ChromiumWebBrowser对象父控件的Dispose方法。 仅供参考
向高手致敬,彻底解决!
Anonymous477 2018-08-02
  • 打赏
  • 举报
回复
测试了一下,用的net461,cef版本49.0.0。。大概是这样操作的。。

先获取ChromiumWebBrowser的Browser,然后再关闭Browser;即
browser.GetBrowser().CloseBrowser(false);

另外测试的时候使用的TabControl,如果没有显式释放TabPage的话,在窗口切换后会出现异常,即需要显式调用ChromiumWebBrowser对象父控件的Dispose方法。

仅供参考

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧