![](/img/trans.png)
[英]How do I send javascript event from webbrowser wpf control to c# code of wpf
[英]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中做了什么:
這是可能的,但我還沒有在.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.