none
webBrowser與InvokeMember RRS feed

  • 問題

  • 我對webBrowser與InvokeMember有以下幾個問題

    1.為什麼webBrowser會一直呼叫DocumentCompleted??
    我只有做一次 webBrowser1.Navigate()的動作他卻一直呼叫??
    有什麼方法可以阻止這個??

    2.當我按下按鈕時呼叫webBrowser連結到一個網頁然後,做InvokeMember(click)的動作,
    然後網頁端會將原本隱藏的DIV做顯示動作,然後當DIV顯示時會在
    做一次InvokeMember(click)的動作

    如果把以上動作拆成三個,每一個動作用一個BUTTON來呼叫是可以執行的

    (EX:1.按下按鈕時呼叫webBrowser連結到一個網頁
    2.
    做InvokeMember(click)的動作

    3.DIV顯示時會在做一次InvokeMember(click)的動作)

    但假如我如果把已上動作合成一個寫在同一個方法裡就不能執行了(例如:一起寫在webBrowser1_DocumentCompleted()方法)

    於是我猜想是不是第一次InvokeMember(click)執行的動作會比較慢,

    所以我在按下第一次後Thread.Sleep(5 * 1000)先暫時中止,
    結果還是不行,然後又試著是否為webBrowser尚未執行完,

    於是我在按下第一次按鈕後先判斷是否webBrowser尚未執行完,如果執行完就進行InvokeMember(click)的動作

                webBrowser1.Navigate("http://localhost:59551/WebCrackCaptcha/index.aspx");

                while (true)
                {
                    if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
                    {
                        SearchTab();//進行InvokeMember(click)的動作的Method
                        break;
                    }
                    else
                    {
                        Application.DoEvents();
                    }
                }

    結果還是不行.....

    請問大大 知道原因嗎@@??
    順到一問Application.DoEvents()是用來做啥的??

    幫幫忙 謝謝

    2013年7月8日 下午 02:30

所有回覆

  • DoEvents的說明: 如果在程式碼中呼叫 DoEvents,您的應用程式就可以處理其他事件。例如,如果您的表單將資料加入 ListBox 並將 DoEvents 加入程式碼中,則當另一個視窗拖到您的表單上時,該表單將重新繪製。如果您從程式碼移除 DoEvents,您的表單將不會重新繪製,直到按鈕按一下的事件處理常式執行完畢。

    範例 http://msdn.microsoft.com/zh-tw/library/system.windows.forms.application.doevents(v=vs.80).aspx

    2013年7月8日 下午 02:36
  • 參考MSDN文件的說明

    如果網頁中含有frame,則每個frame都會觸發OnDocumentCompleted事件


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2013年7月8日 下午 11:20
  • Mark Shu 視窗拖到您的表單上時  這是什麼意思?
    是只新的表單(EX:Label)加入FORM嗎??然後就會重新取得所有form裡的表單資料嗎??
    重新繪製是只,存脆重新取得ui還是連資料都一起回取??

    感覺個執行緒有點像
    2013年7月10日 上午 07:43
  •  大大 謝謝給我多一條線索
    2013年7月10日 上午 07:44
  • 我前段时间当好做了差不多的东西

    给你几个知识点:

    1、 

    ieBrowser_DocumentCompleted(objectsenderWebBrowserDocumentCompletedEventArgse
                //判断网页是否全部加载完成             if (ieBrowser.ReadyState != WebBrowserReadyState.Completereturn;

    2、动做分开写,放在一个线程里,用 类似

        enum ActionStep
        {
            /// <summary>
            /// 第一步:打开网页主页
            /// </summary>
            Home,   
            
            /// <summary>
            /// 第二步:查找输入框与提交按钮,输入关键字后提交
            /// </summary>
            FindAndQuery,      
     
            /// <summary>
            /// 第三步:查找指定连接,找到后导航到它
            /// </summary>
            Search,            
     
            /// <summary>
            /// 第四步:等待15秒后关闭
            /// </summary>
            WaittingForClose,
     
            End
        }

    这样的代码来判断.

    2013年7月11日 下午 02:38
  • jinli.z 你好:
    我問題的點主要在於第一次按下按鈕的時候,
    DIV還沒有顯示他就已經做輸入和送出的動做了。

    我也有用Thread.Sleep()等候我還設了20秒
    至於你說的方法,是不是把它拆成多個子類別和一個父類別的方式來做??
    我有疑問  這樣會有差嗎??
    因為你主要的執行
    其實還是透過父類別去呼叫呀(只是不懂而已,能否請你解釋一下)
    不過我還是會試試看  謝謝

    2013年7月12日 上午 09:24
  • Thread Procedure
    {
        switch(action)
        {
            case first:

                break;
            case second:

                break;
            case third:

                break;    
        }
        while (!action.Completed)
        {
            Thread.sleep(100);
        }
    }


    ieBrowser_DocumentCompleted(objectsender, WebBrowserDocumentCompletedEventArgse
                //判断网页是否全部加载完成
        if (ieBrowser.ReadyState != WebBrowserReadyState.Complete) return;
        //允许执行下一个动作
        action.Next;

                
    2013年7月12日 上午 10:45
  • jinli.z 你好:
    你的意思是把它分成多個
    Thread的嗎??
    2013年7月17日 上午 07:21