2

我想浏览一个网站,登录并通过我的应用程序填写表格,而不会看到任何用户,最后将其显示给用户提交。

以前我使用网络浏览器控件。它通常可以工作,但有时,用户提交表单后会在网站上引发一些错误。但在 IE 中,此错误不会由相同的数据引发。

有什么方法可以直接在 IE 中使用我的数据导航和填写表单,然后将其显示给用户?(这个站点有很多客户端控件,我必须等待它们对我的数据做出响应(例如在选择状态后加载城市)

4

1 回答 1

2

您可以从 C# 应用程序自动化 Internet Explorer 实例。首先,使用创建互操作程序集SHDocVw.dll并将TlbImp.exe ieframe.dll其添加为对项目的引用。然后使用以下代码创建 Internet Explorer 的进程外实例:

var ie = (SHDocVw.WebBrowser)Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.Application"));
ie.Visible = true;
ie.Navigate("http://www.example.com");

WebBrowser以与使用控件类似的方式使用它。

也就是说,我相信您仍然可以使用托管WebBrowser来实现您想要实现的目标,只需实现功能控制以使其行为方式与 IE 相同(或尽可能接近)。

[编辑]然而,这个无辜的例子可能有一个隐藏的问题。因为您在这里自动化了一个进程外 COM 对象,所以它的事件(如果您处理任何事件)可能会到达与您的主 UI 线程不同的线程上。通常,您需要使用Control.InvokeSynchronizationContext.Post / Send 将它们编组回主线程(取决于您是要异步处理它们还是同步处理它们)。这是处理DocumentComplete和处理线程的示例:

using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;

namespace WinformsIE
{
    public partial class Form1 : Form
    {
         public Form1()
        {
            SetBrowserFeatureControl();
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs ev)
        {
            var ie = (SHDocVw.InternetExplorer)Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.Application"));
            ie.Visible = true;
            Debug.Print("Main thread: {0}", Thread.CurrentThread.ManagedThreadId);
            ie.DocumentComplete += (object browser, ref object URL) =>
            {
                string url = URL.ToString();
                Debug.Print("Event thread: {0}", Thread.CurrentThread.ManagedThreadId);
                this.Invoke(new Action(() =>
                {
                    Debug.Print("Action thread: {0}", Thread.CurrentThread.ManagedThreadId);
                    var message = String.Format("Page loaded: {0}", url);
                    MessageBox.Show(message);
                }));
            };
            ie.Navigate("http://www.example.com");
        }

    }
}
于 2013-08-25T09:47:18.343 回答