标签: webbrowser-control

如何在C#中使用WebBrowser控件DocumentCompleted事件?

在开始写这个问题之前,我试图解决以下问题

// 1. navigate to page
// 2. wait until page is downloaded
// 3. read and write some data from/to iframe 
// 4. submit (post) form
Run Code Online (Sandbox Code Playgroud)

问题是,如果网页上存在iframe,则DocumentCompleted事件将被触发多次(在每个文档完成之后).程序很可能试图从DOM中读取未完成且自然失败的数据.

但突然写下这个问题'如果'怪物启发了我,我解决了问题,我试图解决.由于我没有谷歌这个,我觉得在这里发布它会很好.

    private int iframe_counter = 1; // needs to be 1, to pass DCF test
    public bool isLazyMan = default(bool);

    /// <summary>
    /// LOCK to stop inspecting DOM before DCF
    /// </summary>
    public void waitPolice() {
        while (isLazyMan) Application.DoEvents();
    }

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
        if(!e.TargetFrameName.Equals(""))
            iframe_counter --; …
Run Code Online (Sandbox Code Playgroud)

c# automation webbrowser-control c#-2.0

14
推荐指数
1
解决办法
5万
查看次数

使用Interop.SHDocVw.dll我在哪里可以找到这个命名空间/ dll?

我以前做过这个,我不记得我是从网上下载了DLL还是其他东西,但我不想得病毒.我需要访问此命名空间,以便我可以拥有Webbrowswer控件不提供的额外功能.

如何准确添加Com引用.或者我是否需要来自某个地方的dll

谢谢

dll namespaces reference shdocvw webbrowser-control

14
推荐指数
1
解决办法
3万
查看次数

WebBrowser控件 - 防止右键单击

在我的应用程序中,我有一个包含浏览器控件的表单,我在其中显示SSRS报告.我想阻止用户右键单击浏览器控件并显示弹出菜单.理想情况下,我希望右键单击不执行任何操作.有没有办法可以做到这一点?

c# browser webbrowser-control reporting-services

14
推荐指数
1
解决办法
2万
查看次数

Htmlagilitypack中的GetElementsByTagName

如果我不知道它的id,如何为文本框选择一个元素?

如果我知道它的id,那么我可以简单地写:

HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id);
Run Code Online (Sandbox Code Playgroud)

但是我不知道textbox的ID,我在HtmlagilityPack中找不到GetElementsByTagName方法,它在webbrowser控件中可用.在Web浏览器控件中我可以简单地写:

HtmlElementCollection elements = browser[i].Document.GetElementsByTagName("form");
foreach (HtmlElement currentElement in elements)
{

}
Run Code Online (Sandbox Code Playgroud)

编辑

这是我正在谈论的HTML表单

<form id="searchform" method="get" action="/test.php">
<input name="sometext" type="text">
</form>
Run Code Online (Sandbox Code Playgroud)

请注意我不知道表格的ID.并且在同一页面上可以有多种形式.我唯一知道的是"sometext",我想用这个名字来获取这个元素.所以我想我必须逐个解析所有表格然后找到这个名字"sometext"但是我该怎么做?

c# webbrowser-control getelementsbytagname html-agility-pack

14
推荐指数
3
解决办法
3万
查看次数

使用.Net WebBrowser控件时可以检测到错误吗?

我有一个.Net Froms应用程序,它通过WebBrowser控件显示网页.

无论如何,我可以检测到控件是否显示" 找不到页面 "或" 无法显示网页 "错误?似乎没有任何错误事件处理程序.

.net com webbrowser-control winforms

13
推荐指数
2
解决办法
6629
查看次数

SO的形式如何记住以前的输入值?

我注意到如果按浏览器的后退按钮返回到Ask Question页面,会记住TitleBody部分.

我测试的所有浏览器都提供此功能,但我自己的项目中的表单不存在此功能.

我该如何处理这种效果?

UPDATE

我仍然没有任何线索,但猜猜是某种客户端缓存由http标头或javascript启用?

html forms webbrowser-control browser-cache

13
推荐指数
1
解决办法
7676
查看次数

WebBrowser控件和嵌入标签

我相信我遇到了与在我的C#2008 WinForms应用程序中使用带有WebBrowser控件的embed标签相关的安全问题.

这是我的代码:

private void button2_Click(object sender, EventArgs e)
{
    webBrowser1.Navigate("C:/page1.html");
}

private void button1_Click(object sender, EventArgs e)
{
    webBrowser1.Navigate("about:blank");
    Thread.Sleep(1000);
    webBrowser1.Document.Write("<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>");
}
Run Code Online (Sandbox Code Playgroud)

这是page1.html的内容:

<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>
Run Code Online (Sandbox Code Playgroud)

Button1生成单词"Hello".Button2生成单词"Hello",其下方嵌入了一个电影播放器​​.

当我查看两个页面的源时,我注意到它们是相同的,除了源文件的名称.

这让我相信它与我的IE安全设置有关,但我注意到我为嵌入式内容设置了完整的权限.也许控件不能正确识别页面的来源,因此不允许使用嵌入标签.

我怎样才能以编程方式克服这个问题?我想避免将我的页面写入文件,并不惜一切代价导航到该文件.有关如何欺骗浏览器控件正常工作的任何建议?

第一编辑:

根据这篇文章Webbrowser Navigate Embedded Resource这将有效,但是我(JT)尝试了它并没有:

System.IO.Stream stream = this.GetType().Assembly.GetManifestResourceStream("WindowsFormsApplication1.Properties.test.html");
webBrowser1.DocumentStream = stream;
Run Code Online (Sandbox Code Playgroud)

再现问题时的奇怪行为:

webBrowser1.Navigate("about:blank");
do
{
Thread.Sleep(100);
} while (webBrowser1.IsBusy == true);

//Method 1. Doesn't work
string htmlString1 = File.ReadAllText("C:/page1.html");
webBrowser1.Document.Write(htmlString1);

//Method 2. Doesn't work
string htmlString2 = "<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>";
webBrowser1.Document.Write(htmlString2);

//Method 3. DOES …
Run Code Online (Sandbox Code Playgroud)

c# webbrowser-control winforms

13
推荐指数
1
解决办法
4233
查看次数

如何在超时期限后取消任务等待

我正在使用此方法以编程方式实例化Web浏览器,导航到URL并在文档完成时返回结果.

如果文档加载时间超过5秒,我将如何停止TaskGetFinalUrl()返回null

我见过许多使用a的例子,TaskFactory但我无法将其应用于此代码.

 private Uri GetFinalUrl(PortalMerchant portalMerchant)
    {
        SetBrowserFeatureControl();
        Uri finalUri = null;
        if (string.IsNullOrEmpty(portalMerchant.Url))
        {
            return null;
        }
        Uri trackingUrl = new Uri(portalMerchant.Url);
        var task = MessageLoopWorker.Run(DoWorkAsync, trackingUrl);
        task.Wait();
        if (!String.IsNullOrEmpty(task.Result.ToString()))
        {
            return new Uri(task.Result.ToString());
        }
        else
        {
            throw new Exception("Parsing Failed");
        }
    }

// by Noseratio - http://stackoverflow.com/users/1768303/noseratio    

static async Task<object> DoWorkAsync(object[] args)
{
    _threadCount++;
    Console.WriteLine("Thread count:" + _threadCount);
    Uri retVal = null;
    var wb = new WebBrowser();
    wb.ScriptErrorsSuppressed = …
Run Code Online (Sandbox Code Playgroud)

.net c# console-application webbrowser-control task-parallel-library

13
推荐指数
1
解决办法
2万
查看次数

可编辑的HTML内容在很大时非常滞后

例如,我有以下简单的HTML页面,其中<span>[SOME FIELD]</span>重复多次以弥补大约200K的文件大小:

<!DOCTYPE html>
<html>
<head>
</head>
<body editableContent="true">
        <span>[SOME FIELD]</span>
        <span>[SOME FIELD]</span>
...
        <span>[SOME FIELD]</span>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

随着内容的增长,编辑体验变得非常滞后.输入或编辑内容几乎是不可能的.

这是一个完整的repro案例.要查看我的意思,只需将光标移动到可编辑内容的末尾并尝试编辑即可.在IE和Chrome下它落后很长时间,几乎不可能打字.但它在Firefox下运行良好.

问题:我需要在IE下合理快速地运行它.

到目前为止,我已经接近IE8模拟(带<meta http-equiv="X-UA-Compatible" content="IE=8">),所以这是有效的(在IE下).

但是,我也需要支持IE=edge.任何关于如何实现这一点的建议将不胜感激.国际海事组织,这是一个错误(我提交这里IE这里的Chrome),但我在寻找什么解决办法.

更新后,为使用HTML文档模式在独立IE浏览器或托管WebBrowser控件的自定义应用程序中加载的任何解决方案提供了赏金IE=edge.

更新后,报告的相应IE错误刚刚关闭为"无法修复".

html javascript internet-explorer webbrowser-control contenteditable

13
推荐指数
1
解决办法
1792
查看次数

C#挂起并在Application.Run()for for循环后卡住

我正在建立一个冲浪到几个网站并做一些事情的程序.

在成功冲浪到5个网址之后,该程序在Application.Run()行之后挂起.该程序甚至没有进入处理程序功能,只是卡住了.此时CPU使用率为0.

我尝试以任何可能的方式关闭线程.我做错了什么?

我这样做:

[STAThread]
private static void Main(string[] args) 
{
    for (int i = 0; i < urls.Count; i++) 
    {
        var th = new Thread(() = > 
        {
            var weBrowser = new WebBrowser();
            weBrowser.AllowNavigation = true;
            weBrowser.DocumentCompleted += Handler;
            weBrowser.Navigate(urls[i]);
            Application.Run();
        });
        th.SetApartmentState(ApartmentState.STA);
        th.Start();
        th.Join();
    }
}
Run Code Online (Sandbox Code Playgroud)

而我的Handle功能是:

private static void Handler(object sender, WebBrowserDocumentCompletedEventArgs e) 
{
    WebBrowser weBrowser = sender as WebBrowser;
    var htmlDocument = weBrowser.Document;

    /*do something*/

    Application.Exit();
    Application.ExitThread();

    weBrowser.Dispose();
    weBrowser.Stop();

    Thread.CurrentThread.Abort();
}
Run Code Online (Sandbox Code Playgroud)

我的问题非常类似于: Application.Run()导致应用程序挂起

这个问题也没有答案.

谢谢!

c# wpf multithreading for-loop webbrowser-control

13
推荐指数
1
解决办法
1409
查看次数