gpt4 book ai didi

c# - WebBrowser 没有到达 DocumentCompleted 事件

转载 作者:行者123 更新时间:2023-12-02 22:41:22 28 4
gpt4 key购买 nike

我是 c# 的新手,我正在尝试构建一个登录网站并返回其源代码的程序。问题是,我为页面加载时注册了一个事件监听器,但是当我调试它时,它在设置相同事件后退出,实际上并没有在页面“加载”后执行我希望它执行的操作。

这是来源-

using System;
using System.Windows.Forms;

namespace WIN
{
class Program
{
string url = -snip-;
string username = -snip-;
string password = -snip-;
string task = -snip-;
string action = -snip-;
string timezone = -snip-;

private void Login()
{
Console.WriteLine("Started.");
Console.ReadLine();
Console.WriteLine("Declaring WebBrowser instance browser...");
WebBrowser browser = new WebBrowser();
Console.WriteLine("Done.");
Console.ReadLine();
Console.WriteLine("Registering an event for when the page finishes loading...");
browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(pageLoaded);
Console.WriteLine("Done.");
Console.ReadLine();
Console.WriteLine("Using method Navigate of browser instance with url parameter...");
browser.Navigate(url);
Console.WriteLine("Done.");
Console.ReadLine();

}

private void pageLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{
Console.WriteLine("Declaring WebBrowser instance browser as sender...");
WebBrowser browser = sender as WebBrowser;
Console.WriteLine("Done.");
Console.ReadLine();
string response = browser.DocumentText;

Console.WriteLine("Searching for authenticity token...");
// looks in the page source to find the authenticity token.
// could also use regular expressions here.
int index = response.IndexOf("authenticity_token");
int startIndex = index + 41;
string authenticityToken = response.Substring(startIndex, 40);
Console.WriteLine("Found authenticity token.");

Console.WriteLine("Unregistering first event handler...");
// unregisters the first event handler
// adds a second event handler
browser.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(pageLoaded);
Console.WriteLine("Done.");
Console.WriteLine("Adding second event handler...");
browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(pageLoaded2);
Console.WriteLine("Done.");
Console.Read();

Console.WriteLine("Formatting data to be posted to server...");
string postData = string.Format("_user={0}&_pass={1}&authenticity_token={2}&_task{3}&_action{4}&_timezone{5}", username, password, authenticityToken, task, action, timezone);
Console.WriteLine("Done.");
Console.Read();

Console.WriteLine("Declaring ASCIIEncoding instance enc...");
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
Console.WriteLine("Done.");
Console.Read();

// we are encoding the postData to a byte array
Console.WriteLine("Encoding postData to a byte array...");
browser.Navigate(url, "", enc.GetBytes(postData), "Content-Type: application/x-www-form-urlencoded\r\n");
Console.WriteLine("Done..");
Console.Read();

}

[STAThread]
static void Main(string[] args)
{
Program p = new Program();
p.Login();
}
}
}

从所有这些控制台输出中,它只会到达使用方法 Navigate of browser instance with url parameter...

最佳答案

WebBrowser 要求您的程序提供一个消息循环。否则它不会触发事件。这通常是任何使用单线程 COM 组件的程序的要求。或者用更易于理解的术语来说:您不能让程序忙于从控制台读取数据,同时触发 DocumentCompleted 等事件。一个线程一次只能做一件事。您可以通过编写一个 Winforms 应用程序或使用 Application.Run() 自己启动一个来泵送消息循环。使用消息循环,一个线程可以一次做不止一件事。但这确实需要与您现在编写的代码截然不同的代码,您仍然不能使用 Console.ReadLine(),而是使用 TextBox。

您可以通过在单独的线程中运行浏览器来挽救您所拥有的,您将在 this answer 中找到您需要的代码.

关于c# - WebBrowser 没有到达 DocumentCompleted 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10720703/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com