2012年2月14日 星期二

讓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呼叫:
1public void justMessageBox(string pMessage)
2{
3    MessageBox.Show(pMessage);
4}
接著到我目標的網頁去,我只有放一個button,這個button按下去後會透過window.external去呼叫我剛剛在Winform中寫好的justMessageBox function:
image
好了,這樣應該可以使用了吧,按下建置-->執行,網頁載入完成後,我按下Button1,結果卻出現這個錯誤訊息:
image
window.external竟然是null,我應該是漏了什麼步驟吧,又檢查了一下,發現人家程式中有用到一個Webbrowser的隱藏屬性,這個屬性在屬性視窗中是看不到的,趕快在我的建構函式中加入這一行:
1webBrowser1.ObjectForScripting = this;
這個屬性蠻少用到的,我們參考一下MSDN的說明:http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting.aspx
image
不過它網頁提到,除了上頭那個屬性設定外,也需要在class的屬性上多加上這兩行:
1[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
2[System.Runtime.InteropServices.ComVisibleAttribute(true)]
PermissionSet這部分或許我們在之後的應用程式安全中可再多做說明,而在此處我們先設為FullTrust,代表完全信任;而ComVisibleAttribute這個屬性主要是在設定這個class或者assembly是否為COM可見的型別,如果我把這一行拿掉,我們程式執行時會出現這樣的錯誤:
image
當我們做完以上的工作後,再次執行程式,讓人振奮的,我希望的結果出現了,我透過javascript呼叫到我Winform程式中的justMessgeBox function:
image
接著我再改一下我要做的事情,我寫這樣,嘗試由Webbrowser中要Winform去幫我叫起client端的notepad,執行的結果也是OK的。
1public void justMessageBox(string pMessage)
2{
3    Process tProc = new Process();
4    tProc.StartInfo.FileName = "notepad.exe";
5    tProc.Start();
6}
試出來的做法比前面找到的那篇來的簡單,自己玩了一下也還沒有遇到太特別的問題,這個功能對MSN這類型的小工具實在是一項利器,太棒了,這邊分享給各位。

參考資料:

沒有留言:

張貼留言