2010-01-24 108 views
1

我想用AxWebBrowser上的控制檯應用程序,但它給我以下異常:如何使用AxWebBrowser在控制檯應用程序

類型的異常「System.Windows.Forms.AxHost + InvalidActiveXStateException」被拋出。

有誰請幫助我在此以任何示例代碼爲控制檯應用程序用c#AxWebBrowser沒有任何exeption ...

+0

爲x86而不是x64構建項目。 – 2010-02-05 12:02:51

回答

0

STAThread屬性添加到您的Main方法。

但是,您不應該使用「原始」ActiveX控件。

相反,請添加對System.Windows.Forms.dll的引用並使用WebBrowser類。 (是的,你可以在控制檯應用程序中做到這一點)


另外,自動化IE並不理想。您應該考慮使用WebCLient類。

+0

您可以寫一個示例代碼來添加STAThread屬性... – 2010-01-24 14:16:04

+1

只需在您的Main()方法上添加'[STAThread]'。 – 2010-01-24 14:23:56

+0

謝謝,但實際上我有一個名爲「瀏覽」的類,控制檯應用程序使用url輸入參數調用其「StartBrowse」方法,並且在此函數中,我應該瀏覽該URL並執行一些處理並返回一些結果,以便我應該在哪裏放置[STAThread]屬性?我把它放在「StartBrowse」方法之前,但它在運行時給了我同樣的例外! – 2010-01-24 15:09:24

1

是的,您的Main()方法需要[STAThread]屬性,以便正確初始化COM以使主線程成爲單線程公寓。這並不是全部,但你也需要抽取一個消息循環。這是STA的要求。沒有人,WebBrowser無法更新其狀態或運行其事件處理程序,例如,您將永遠無法獲得DocumentCompleted事件。您可以通過Application.Run()獲得消息循環。

您的控制檯應用程序現在無法與Windows窗體應用程序區分開來。通過使用Windows Forms應用程序項目模板,然後使用Project + Properties,Output type = Console Application來啓動一個新項目,實際上更容易。編輯Program.cs中的Application.Run()調用,以便它不創建表單。它不會使處理Application.Run()更容易,可以考慮一個Timer來運行代碼。

0

我的班級如下但是在運行時它給了我System.Windows.Forms.AxHost + InvalidActiveXStateException:

public class Browse 
{ 

    private static AxWebBrowser wBrowser;   
    public static Result StartBrowse(string url) 
    { 
     var validUri = (url.Contains("http://") ? url : "http://" + url); 
     wBrowser = new AxWebBrowser(); 

     System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(AxWebBrowser)); 

     ((ISupportInitialize) (wBrowser)).BeginInit(); 
     wBrowser.OcxState = ((AxHost.State)(resources.GetObject("wBrowser.OcxState"))); 

     wBrowser.NewWindow2 += wBrowser_NewWindow2; 
     wBrowser.NewWindow3 += wBrowser_NewWindow3; 
     wBrowser.DocumentComplete += wBrowser_DocumentComplete; 
     wBrowser.DownloadComplete += wBrowser_DownloadComplete; 
     if (string.IsNullOrEmpty(html) || validUri != url) 
     { 
      object empty = System.Reflection.Missing.Value; 
      wBrowser.Silent = true; 
      wBrowser.Navigate(validUri, ref empty, ref empty, ref empty, ref empty); 
     } 
     return null; 
    } 

    static void wBrowser_DownloadComplete(object sender, EventArgs e) 
    { 
     doAlgorithm(); 
    } 

    static void wBrowser_DocumentComplete(object sender, DWebBrowserEvents2_DocumentCompleteEvent e) 
    { 
     doAlgorithm(); 
    } 

    static void wBrowser_NewWindow3(object sender, DWebBrowserEvents2_NewWindow3Event e) 
    { 
     e.cancel = true; 
    } 

    static void wBrowser_NewWindow2(object sender, DWebBrowserEvents2_NewWindow2Event e) 
    { 
     e.cancel = true; 
    } 
} 
0

首先,在控制託管必須是單線程的線程公寓,你可以把STAThread在你的主要方法,或創建一個獨立的線程是這樣的:

var thread = new Thread(() => 
{ 
    //My code 
}); 
thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 
thread.Join(); //Wait for thread termination 

其次,你必須啓動一個消息循環:

while (true) //Put some exit condition 
    System.Windows.Forms.Application.DoEvents(); 

第三個控件必須以可見的形式託管。該表格必須是可見的只有一次,所以要避免「閃爍」,你可以這樣寫代碼:

var browser = new AxWebBrowser(); 
var hostForm = new Form(); 
//Set form 0 size, without any control box/title/icon 
hostForm.Width = 0; 
hostForm.Height = 0; 
hostForm.ShowInTaskbar = false; 
hostForm.ControlBox = false; 
hostForm.ShowIcon = false; 
hostForm.MinimizeBox = false; 
hostForm.MaximizeBox = false; 
//Add browser control 
hostForm.Controls.Add(browser); 
//Show and immediately hide 
hostForm.Show(); 
hostForm.Hide(); 

最後,你可能要禁用「咔嚓」聲(How to disable click sound in WebBrowser Control

最後的代碼:

class Program 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 
     URLSecurityZoneAPI.InternetSetFeatureEnabled(URLSecurityZoneAPI.InternetFeaturelist.DISABLE_NAVIGATION_SOUNDS, URLSecurityZoneAPI.SetFeatureOn.PROCESS, true); 

     var browser = new AxWebBrowser(); 
     var hostForm = new Form(); 
     hostForm.Width = 0; 
     hostForm.Height = 0; 
     hostForm.ShowInTaskbar = false; 
     hostForm.ControlBox = false; 
     hostForm.ShowIcon = false; 
     hostForm.MinimizeBox = false; 
     hostForm.MaximizeBox = false; 
     hostForm.Controls.Add(browser); 
     hostForm.Show(); 
     hostForm.Hide(); 

     browser.DocumentComplete += delegate(object sender, DWebBrowserEvents2_DocumentCompleteEvent e) 
     { 
      var doc = (IHTMLDocument3)browser.Document; 
      Console.WriteLine(doc.documentElement.innerHTML); 
     }; 

     browser.Navigate("www.google.com"); 

     while (true) 
      System.Windows.Forms.Application.DoEvents(); 
    } 
} 
相關問題