我正在使用WebBrowser登录某个网站。登录本身是可以的,但它打开了一个新窗口,我失去了对它的控制。以下是代码段。
HtmlDocument htmlDocAceCounter = this.webBrowser1.Document;
HtmlElement elementLoginID = htmlDocAceCounter.GetElementById("userid");
HtmlElement elementPassword = htmlDocAceCounter.GetElementById("userpasswd");
if ((elementLoginID != null) && (elementPassword != null))
{
elementLoginID.SetAttribute("Value", "someid");
elementPassword.SetAttribute("Value", "somepw");
webBrowser1.Navigate("www.loginURL.com");
}
问题是它首先打开带有加密网址的新窗口,然后再到达主网页。所以我无法控制登录页面,也不知道如何到达那里。
无论如何都有解决这个问题的方法吗?任何建议将不胜感激。
修改:它并不完全重复。这是我糟糕的解释。首先使用loginURL.com打开新窗口,浏览加密的网址,然后打开登录页面。我不知道它是如何检测到它的,但它只批准直接点击弹出窗口的有效访问权限。我尝试了很多东西,但我无法在中间切割。使用上述示例,它不会到达加密的网址,只停留在loginURL.com。我希望它能更好地解释。
Edit2 :来自
private void Web_V1_NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData,string Headers, ref bool Processed)
{
Processed = true; //Stop event from being processed
//Code to open in same window
this.webBrowser1.Navigate(URL);
//Code to open in new window instead of same window
//Form1 Popup = new Form1();
//Popup.webBrowser1.Navigate(URL);
//Popup.Show();
}
标题有 Content-Type:application / x-www-form-urlencoded ,PostData有一些可以翻译成ascii字符的东西。如何将它们翻译成正确的URL地址?
编辑3 :我用过
this.webBrowser1.Navigate(URL, TargetFrameName, (byte[])PostData, Headers);
而不是
this.webBrowser1.Navigate(URL);
现在我得到了COMException(0x80004005):错误HRESULT E_FAIL。有没有人有任何想法?
答案 0 :(得分:0)
好。我找到了答案。 COMException(0x80004005):错误HRESULT E_FAIL发生,因为我试图从COM线程访问主线程对象。以下是我的所作所为。
public partial class Form1 : Form
{
WebBrowser browser;
SHDocVw.WebBrowser_V1 browserV1AceCounter;
byte[] bPostData;
string sHeader;
string sURL;
public Form1()
{
InitializeComponent();
browser = new WebBrowser();
browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browserLoaded);
browser.NewWindow += new CancelEventHandler(WebBrowserNewWindow);
}
private void WebBrowserNewWindow(Object sender, CancelEventArgs e)
{
browserV1AceCounter = (SHDocVw.WebBrowser_V1)browser.ActiveXInstance;
browserV1AceCounter.NewWindow += Web_V1_NewWindow;
}
private void Web_V1_NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
{
try
{
Processed = true; //Stop event from being processed
// Copy necessary info to use in main thread
sURL = URL;
bPostData = (byte[])PostData;
sHeader = Headers;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void browserLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{
try
{
if (e.Url.ToString().Contains("loginURL.com"))
{
this.browser.Navigate(sURL, null, bPostData, sHeader);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
您需要确保序列正常并填写其余部分,但是如果您需要通过带有加密帖子数据的弹出窗口,则上面的代码段应该可以正常工作。