我想浏览一个网站,登录并通过我的应用程序填写表格,而不会看到任何用户,最后将其显示给用户提交。
以前我使用网络浏览器控件。它通常可以工作,但有时,用户提交表单后会在网站上引发一些错误。但在 IE 中,此错误不会由相同的数据引发。
有什么方法可以直接在 IE 中使用我的数据导航和填写表单,然后将其显示给用户?(这个站点有很多客户端控件,我必须等待它们对我的数据做出响应(例如在选择状态后加载城市)
我想浏览一个网站,登录并通过我的应用程序填写表格,而不会看到任何用户,最后将其显示给用户提交。
以前我使用网络浏览器控件。它通常可以工作,但有时,用户提交表单后会在网站上引发一些错误。但在 IE 中,此错误不会由相同的数据引发。
有什么方法可以直接在 IE 中使用我的数据导航和填写表单,然后将其显示给用户?(这个站点有很多客户端控件,我必须等待它们对我的数据做出响应(例如在选择状态后加载城市)
您可以从 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.Invoke或SynchronizationContext.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");
}
}
}