我试图在C#Winform应用程序中嵌入一个WebBrowser控件.这听起来很容易.但是我发现每次调用Navigate方法时,WebBrowser控件都会占用大量内存.永远不会释放内存.内存使用量增长和增长......
网上有很多人有完全相同的问题,但我还没有找到满意的答案.这是迄今为止我发现的关于这个问题的最佳讨论:
一个人建议升级到IE8来解决问题.
但是,无论用户是否安装了最新的IE版本,我都需要一个解决方案.我无法控制用户环境.
有人知道如何释放WebBrowser控件占用的内存吗?有变通方法吗?是否有WebBrowser控件的替代品?
更新: 我刚做了几个测试.在工作中我运行的是Windows XP和IE6.记忆力并没有在那里增长.调用导航方法时内存增加但一段时间后释放.在家我运行Vista并升级到IE8.在这里,我也不再看到问题了.看起来问题是IE7特有的.因此,问题应该改为"如何在安装IE7时修复IE WebBrowser控件中的内存泄漏".任何人都可以确认这个问题是否特定于IE7?
我正在尝试创建一个程序,通过我们的缺陷跟踪系统的Web界面一次克隆多个错误.在继续之前,如何在页面完全加载之前等待?
//This is pseudo code, but this should give you an idea of what I'm trying to do. The
//actual code uses multi-threading and all that good stuff :).
foreach (string bug in bugs)
{
webBrowser.Navigate(new Uri(url));
webBrowser.Document.GetElementById("product").SetAttribute("value", product);
webBrowser.Document.GetElementById("version").SetAttribute("value", version);
webBrowser.Document.GetElementById("commit").InvokeMember("click");
//Need code to wait for page to load before continuing.
}
Run Code Online (Sandbox Code Playgroud) 显然,WPF WebBrowser控件存在一些严重的键盘和焦点问题.我整理了一个简单的WPF应用程序,只是一个WebBrowser和两个按钮.该应用程序加载一个非常基本的可编辑HTML标记(<body contentEditable='true'>some text</body>)并演示以下内容:
标签是行为不端的.用户需要按两次Tab键才能在WebBrowser中查看插入符号(文本光标)并能够键入.
当用户切换远离应用程序时(例如,使用Alt-Tab),然后返回,插入符号消失,她根本无法键入.需要物理鼠标单击WebBrowser的窗口客户端区域才能取回插入符号和击键.
不一致的是,一个虚线的焦点矩形出现在WebBrowser周围(当标签时,但不是点击时).我找不到摆脱它的方法(FocusVisualStyle="{x:Null}"没有帮助).
在内部,WebBrowser永远不会得到关注.对于逻辑焦点(FocusManager)和输入焦点(键盘)都是如此.将Keyboard.GotKeyboardFocusEvent和FocusManager.GotFocusEvent从不事件被解雇的web浏览器(虽然他们都对按钮做在同一个焦点范围).即使当插入符号是web浏览器内,FocusManager.GetFocusedElement(mainWindow)指向先前聚焦元件(按钮)和Keyboard.FocusedElement是null.同时,((IKeyboardInputSink)this.webBrowser).HasFocusWithin()回报true.
我会说,这样的行为几乎太功能无法实现,但这就是它的运作方式.我可能想出一些黑客来解决它并将其与原生WPF控件一起排成一行TextBox.我仍然希望,也许我在这里错过了一些模糊而简单的东西.有没有人处理过类似的问题?任何有关如何解决这个问题的建议将不胜感激.
此时,我倾向于为基于HwndHost的 WebBrowser ActiveX控件开发内部WPF包装器.我们还在考虑 WebBrowser的其他替代方案,例如Chromium Embedded Framework(CEF).
VS2012项目可以从这里下载,以防有人想玩它.
这是XAML:
<Window x:Class="WpfWebBrowserTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Width="640" Height="480" Background="LightGray">
<StackPanel Margin="20,20,20,20">
<ToggleButton Name="btnLoad" Focusable="True" IsTabStop="True" Content="Load" Click="btnLoad_Click" Width="100"/>
<WebBrowser Name="webBrowser" Focusable="True" KeyboardNavigation.IsTabStop="True" FocusVisualStyle="{x:Null}" Height="300"/>
<Button Name="btnClose" Focusable="True" IsTabStop="True" Content="Close" Click="btnClose_Click" …Run Code Online (Sandbox Code Playgroud) 我在C#中使用webBrowser控件来加载网页,需要调用一个返回字符串值的JavaScript函数.我有一个使用InvokeScript方法的解决方案,我尝试了很多,但一切都失败了.
如何在不重新启动应用程序的情况下清除当前会话数据(cookie,缓存数据,身份验证会话等)?
更新:我在谈论Windows.Forms中的WebBrowser控件,而不是ASP.Net会话.
VS2008,.NET 2,VB.NET,XP ......
我有一个Windows窗体,有一个WebBrowser控件和一个关闭按钮,它只是一个Me.Close.表单的取消按钮设置为关闭按钮,以便我可以按ESC键关闭表单.
我DocumentText在load事件中设置WebBrowser控件的属性,并显示HTML.
从Visual Studio运行应用程序,如果单击"关闭"按钮,表单将关闭,不会出现任何错误.
如果我按下ESC按钮,我会得到
检测到RaceOnRCWCleanup消息:已尝试释放正在使用的RCW.RCW正在活动线程或另一个线程上使用.尝试释放正在使用的RCW可能会导致损坏或数据丢失.
如果我在VS外面运行应用程序,我没有错误.
任何想法a)为什么错误,和b)如何预防或抑制它?
提前谢谢了.
我使用Javascript单击webbrowser控件中的链接.但我不想听到IE的"咔嗒"声.
有没有办法做到这一点?
PS
Document.Write对我来说不是一个选项.我正在使用C#编写的windows.form应用程序上的Webbrowser控件.我想写一个方法,在访问某个站点后从Webbrowers控件中删除cookie.不幸的是,我不知道该如何做到这一点,并没有在互联网上找到很多帮助.
如果有人有实际经验,不仅仅是假设,因为它可能比看起来更棘手,我不知道.
int count = webBrowser2.Document.Cookie.Length;
webBrowser2.Document.Cookie.Remove(0,count);
Run Code Online (Sandbox Code Playgroud)
我只是假设上面的代码可以工作,但我想它不会.任何人都可以对这整个饼干有所了解吗?
我们有几个curses样式的应用程序,我们希望通过基于浏览器的界面提供访问.
我们有一个来自其他供应商的应用程序,它表面上基于旧版本的JTA(Java Telnet应用程序)提供此应用程序, 但该applet不能处理调整好的事情,并且对回滚缓冲区和复制/粘贴的支持相对较差.
在基于Ajax的界面的这一天,我很好奇是否有任何好的,免费的解决方案.
感谢这个网站,我看到了对Reflection的基于网络的终端模拟器的引用,但这可能对我们的需求来说太贵了.
我见过的一些潜在候选人包括
ajaxterm
没有回滚栏
但我没有机会做详细的评估.
我正在使用WebBrowser的Navigate功能加载网站,我希望浏览器加载带有我给它的cookie的页面.
以下代码不起作用:
wb.Navigate(url, null, null, "Cookie: " + cookie + "\n");
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我必须使用InternetSetCookie吗?这似乎不是最好的解决方案.
c# ×6
.net ×5
winforms ×3
browser ×2
audio ×1
controls ×1
cookies ×1
focus ×1
javascript ×1
keyboard ×1
memory-leaks ×1
rcw ×1
terminal ×1
wpf ×1
wpf-controls ×1