2

私はc#を初めて使用し、Webサイトにログインしてそのソースコードを返すプログラムを作成しようとしています。問題は、ページがロードされたときにイベントリスナーを登録しますが、デバッグすると、同じイベントを設定した後に終了し、ページが「ロード」された後に実際に実行したいことを実行しません。

これがソースです-

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

これらすべてのコンソール出力から、URLパラメータを使用したブラウザインスタンスのメソッドナビゲートの使用にのみ到達します。

4

1 に答える 1

5

WebBrowser では、プログラムがメッセージ ループをポンピングする必要があります。それ以外の場合、イベントは発生しません。これは一般に、シングルスレッド COM コンポーネントを使用するすべてのプログラムの要件です。または、よりわかりやすい言葉で言えば、プログラムがコンソールからの読み取りでビジー状態になり、同時に DocumentCompleted のようなイベントを発生させることはできません。スレッドは、一度に 1 つのことしか実行できません。Winforms アプリを作成するか、Application.Run() を使用して自分で開始することにより、メッセージ ループをポンピングします。メッセージ ループを使用すると、スレッドは一度に複数のことを実行できます。しかし、それには今書いたものとは非常に異なるコードが必要です.Console.ReadLine()はまだ使用できません.代わりにTextBoxを使用します.

ブラウザーを別のスレッドで実行することで、持っているものを救うことができます。そのために必要なコードは、この回答にあります。

于 2012-05-23T13:37:24.830 に答える