C# - 控制弹出窗口

时间:2015-06-18 10:20:08

标签: c# popup

我正在使用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。有没有人有任何想法?

1 个答案:

答案 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());
        }
    }
}

您需要确保序列正常并填写其余部分,但是如果您需要通过带有加密帖子数据的弹出窗口,则上面的代码段应该可以正常工作。