[C#]讓Webbrowser中的js直接呼叫Winform的function

[C#]讓Webbrowser中的js直接呼叫Winform的function

在Winform中內嵌Webbrowser想來也是一個很普遍的功能吧,一般我們在Winfrom中內嵌Webbrowser的使用大概也分不開幾種吧:

1.內嵌網頁View

2.擷取網頁內容做處理

3....

不過今天我們聽到一個很有趣的需求,使用者希望,當點選網頁上的某個按鈕後,要在client執行某個winform系統,通常我們在純Webform上聽到這個需求,都會覺得有些許荒謬,叫Webform去叫Winform程式?應該是搞錯了吧?難道又要我使用很不想使用的ActiveX嗎?沒有更簡單一點的方法了嗎?

後來想到我現在是個Winform的程式,不知道有沒有機會透過Webbrowser中內嵌的Web form,透過javascript來呼叫我的Winform程式,然後由Winform程式來呼叫我client端的Winform程式呢?搜尋了一下,找到這篇:WinForm透過WebBrowser與JavaScript溝通

看了一下總覺得他的方法太過複雜,我就想起之前我們組有個小工具好像有類似的功能,翻了一下它的說明文件,酷喔,還真的有這樣的功能呢?看了一下它code的寫法,一整個簡潔,只要作些簡單設定就好了,下面我們先來看一下它如何達成我們以上的功能:

先在Winform程式中拉一個Webbrowser元件,並將Url指定到某個網頁:

image

接著在Winform程式中先寫一個簡單的function叫justMessageBox準備保留讓javascript呼叫:


{
    MessageBox.Show(pMessage);
}

接著到我目標的網頁去,我只有放一個button,這個button按下去後會透過window.external去呼叫我剛剛在Winform中寫好的justMessageBox function:

image

好了,這樣應該可以使用了吧,按下建置-->執行,網頁載入完成後,我按下Button1,結果卻出現這個錯誤訊息:

image

window.external竟然是null,我應該是漏了什麼步驟吧,又檢查了一下,發現人家程式中有用到一個Webbrowser的隱藏屬性,這個屬性在屬性視窗中是看不到的,趕快在我的建構函式中加入這一行:

這個屬性蠻少用到的,我們參考一下MSDN的說明:http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting.aspx

image

不過它網頁提到,除了上頭那個屬性設定外,也需要在class的屬性上多加上這兩行:


[System.Runtime.InteropServices.ComVisibleAttribute(true)]

PermissionSet這部分或許我們在之後的應用程式安全中可再多做說明,而在此處我們先設為FullTrust,代表完全信任;而ComVisibleAttribute這個屬性主要是在設定這個class或者assembly是否為COM可見的型別,如果我把這一行拿掉,我們程式執行時會出現這樣的錯誤:

image

當我們做完以上的工作後,再次執行程式,讓人振奮的,我希望的結果出現了,我透過javascript呼叫到我Winform程式中的justMessgeBox function:

image

接著我再改一下我要做的事情,我寫這樣,嘗試由Webbrowser中要Winform去幫我叫起client端的notepad,執行的結果也是OK的。


{
    Process tProc = new Process();
    tProc.StartInfo.FileName = "notepad.exe";
    tProc.Start();
}

試出來的做法比前面找到的那篇來的簡單,自己玩了一下也還沒有遇到太特別的問題,這個功能對MSN這類型的小工具實在是一項利器,太棒了,這邊分享給各位。

 

參考資料:

WinForm透過WebBrowser與JavaScript溝通

MSDN Webbrowser.ObjectForScripting

JavaScript extensions: window.external

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。