簡體   English   中英

WinForms - 如何從WebBrowser控件中執行C#應用程序代碼?

[英]WinForms - How do I execute C# application code from inside WebBrowser control?

我有一個包含Web瀏覽器控件的表單。 此瀏覽器控件將從磁盤加載一些HTML並顯示它。 我希望能夠在我的表單中的HTML訪問C#代碼中有一個按鈕。

例如,HTML中的按鈕可能會調用窗體上的Close()方法。

目標平台:C#和Windows Forms(任何版本)

我在過去的一些應用程序中已經實現了這一點,具體如下:(注意:下面的示例不是生產就緒的,應該僅用作指南)。

首先創建一個普通的.NET類(public),其中包含您希望從Web瀏覽器控件中運行的Javasvcipt調用的公共方法。

最重要的是,它必須使用System.Runtime.InteropServices命名空間中的ComVisible(true)]屬性進行修飾(IE中的Javascript基於COM)。 它可以被稱為任何東西,我稱之為“外部”以使事情更清晰。

using System.Runtime.InteropServices;

[ComVisible(true)]
public class External
{
    private static MainWindow m_mainWindow = null;

    public External(MainWindow mainWindow)
    {
        m_mainWindow = mainWindow; 
    }

    public void CloseApplication()
    {
        m_mainWindow.Close();
    }


    public string CurrentDate(string format)
    {
        return DateTime.Now.ToString(format);  
    }
}

接下來在包含Web瀏覽器控件的.NET表單中創建COMVisible類的實例,然后將Web瀏覽器控件ObjectForScripting設置為該實例:

    private void MainWindow_Load(object sender, EventArgs e)
    {
         m_external = new External(this);

         browserControl.ObjectForScripting = m_external; 
    }

最后,在Web瀏覽器控件中運行的Javascript中,您可以通過window.external對象訪問.NET方法。 在這種情況下,window.external實際引用(間接通過COM interop包裝器)上面創建的“External”對象:

// Javascript code
function CloseButton_Click()
{
    if (window.external)
    {
        window.external.CloseApplication();
    }
}

請注意,從Javascript到.NET的調用將通過COM互操作層,因此必須進行查詢默認接口,編組參數等。 換句話說,它可能相對較慢,如果您打算例如從循環內進行多次調用,那么請進行一些性能測試。

此外,僅供將來參考,從.NET調用Javascript代碼更簡單,只需使用Document.InvokeScript方法:

    browserControl.Document.InvokeScript("jScriptFunction", new object[] { "param1", 2, "param2" });

查看WebBrowser.ObjectForScripting屬性。 管理以使用此方式讓Google地圖與Windows窗體應用程序通信。

我在VB6中做了什么:

  • 在HTML文檔中添加一堆自定義<A>標記,將其href設置為對您有意義的內容,例如'#closeform'
  • 在BeforeNavigate方法上,檢查瀏覽器嘗試訪問的地址並采取相應措施。 然后取消瀏覽器導航。

這是可能的,但我還沒有在.NET中完成它。 幾年前,我有一個托管Web瀏覽器控件(ActiveX)的C ++應用程序。 從控件中的HTML中,可以將“out”調用到ActiveX控件並使其執行操作。

盡管HTML DOM / JavaScript不了解C#,但在.NET中應該是可能的。 但是,如果將.NET功能包裝在COM對象中,則應該能夠調用COM / ActiveX對象上的方法,這些方法將反過來調用您的C#代碼。

希望這可以幫助。

您所要做的就是為WebBrowser的Navigating事件添加一個事件處理程序。

在瀏覽器導航到下一頁之前,會觸發此事件。 它允許您中斷進程並執行任何操作,包括取消導航和調用代碼。

很容易使用。 我遇到的唯一警告是你無法查看PostData - 請看我的問題: PostData問題

這是一些示例代碼:

    private void MyMethod()
    {
        // do something
    }

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        MyMethod();
        e.Cancel = true;
    }

幾年前我做過這個,並在這里寫博客:

http://matthewskelton.wordpress.com/2007/04/21/calling-javascript-from-c/

具體來說,您可以使用Type.InvokeMember()從C#調用JavaScript。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM