最近的一個B/S系統中,用到了指模錄入,當用戶按了手指摸以後,要在IE瀏覽器的一個文本框上顯示用戶的姓名。因爲要監控指模機的輸入,所以客戶端須要裝一個.net控制檯程序,經過此控制檯程序監控指模機。這個沒辦法。這個.net控制檯程序裝在公司前臺的電腦上就OK了。而後經過局域網與指模機相聯,當用戶按手指摸而且驗證經過以後,從指模機讀取用戶的姓名,而後檢測當前瀏覽器是否有打開系統上的某個頁面。若是有,則將姓名輸入到IE瀏覽器的響應文本框。html
這裏用到的最麻煩的一個東東就是C#操做IE瀏覽器。以前太孤陋寡聞,一開始的想法是控制檯程序發送上遠程服務器,而後頁面AJAX輪詢,可是耗用比較大的資源。下面主要經過com組件實現控制檯程序操做IE。web
一、首先,須要添加com組件的引用shell
二、打開一個新Tab並打開指定地址瀏覽器
//新建一個Tab,而後打開指定地址 SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass(); object objFlags = 1; object objTargetFrameName = ""; object objPostData = ""; object objHeaders = ""; SHDocVw.InternetExplorer webBrowser1= (SHDocVw.InternetExplorer)shellWindows.Item(shellWindows.Count-1); webBrowser1.Navigate("http://www.baidu.com", ref objFlags, ref objTargetFrameName, ref objPostData, ref objHeaders);
若是須要手動啓動IE瀏覽器進程的話,可使用:安全
Process.Start("iexplore.exe"); //直接打開IE瀏覽器(打開默認首頁) Process.Start("iexplore.exe","http://www.cnblogs.com/kissdodog"); //直接打開IE瀏覽器,打開指定頁
三、操做js服務器
下面,經過操做js實現以下效果:往百度搜索框裏面輸入"劉德華"並點擊搜索。app
//遍歷全部選項卡 foreach (SHDocVw.InternetExplorer Browser in shellWindows) { if (Browser.LocationURL.Contains("www.baidu.com")) { //經過操做js點擊按鈕 if (Browser.Document is HTMLDocumentClass) { HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass; HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script"); //script.text = "alert(123);"; //剛好百度用了jQuery script.text = "$(\"#kw1\").val('劉德華'); $(\"#su1\").click();"; HTMLBodyClass body = doc2.body as HTMLBodyClass; body.appendChild((IHTMLDOMNode)script); } } }
四、C#直接經過DOM操做IE測試
C#直接經過Dom操做IEspa
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass(); //遍歷全部選項卡 foreach (SHDocVw.InternetExplorer Browser in shellWindows) { if (Browser.LocationURL.Contains("www.baidu.com")) { mshtml.IHTMLDocument2 doc2 = (mshtml.IHTMLDocument2)Browser.Document; mshtml.IHTMLElementCollection inputs = (mshtml.IHTMLElementCollection)doc2.all.tags("INPUT"); mshtml.HTMLInputElement input1 = (mshtml.HTMLInputElement)inputs.item("kw1", 0); input1.value = "劉德華"; mshtml.IHTMLElement element2 = (mshtml.IHTMLElement)inputs.item("su1", 0); element2.click(); } }
五、在裏面操做IFrame.net
操做IFrame是一個比較麻煩的操做,不少方式都不能實現,目前惟一的辦法是經過在頁面上執行一段js實現操做IFrame(但願有人能告訴我)。
2014年8月5日 熱死人了
特別說明:上個星期去客戶電腦上部署的時候,mshtml.dll不管如何都調用不成功,可是在客戶機子上裝了VS以後,又不用改代碼又成功了。首先提示找不到mshtml.dll 7.0.33。而後網上找到一堆方法,把複製都本地設置爲True了。而後又這又那都不行。嘗試了以下方法以後好像OK了,特別作記錄。
mshtml.dll 文件沒有被 IE 正確關聯,可運行命令使其再次關聯。關聯方法較簡單,點擊「開始」菜單裏的「運行」,在空框處填入 regsvr32 /u mshtml.dll 命令先卸載關聯,若是卸載成功,會提示「 mshtml.dll 中的 DllUnregisterServer 成功。」,而後再填入 regsvr32 mshtml.dll 命令進行關聯,若是關聯成功,會提示「 mshtml.dll 中的 DllRegisterServer 成功。」,最後重啓電腦便可。此法最好在安全模式下進行,以防系統正在使用 mshtml.dll 文件而致使卸載和關聯失敗。此法我也試過,對我無效,但願對其它網友有用。
若是提示找不到dll文件,那麼將C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll複製到C:\Windows\assembly
System.NotImplementedException: 未實現該方法或操做。
能夠嘗試在 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727目錄下運行RegAsm.exe
C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll
mshtml.dll /registered
最後把代碼改成:
string sName = "IE測試"; ShellWindows shellWindows = new ShellWindowsClass(); foreach (InternetExplorer Browser in shellWindows) { if (Browser.Document is HTMLDocument) { HTMLDocument doc2 = Browser.Document as HTMLDocument; HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script"); if (sName.Contains("\0")) { sName = sName.Substring(0, sName.IndexOf("\0")); } script.text = string.Format("alert(\"彈出此對話框則正常!\")", sName); HTMLBody body = doc2.body as HTMLBody; if (body == null) { MessageBox.Show("果真是Body爲NULL"); } else { body.appendChild((IHTMLDOMNode)script); } } }
注意,區別在於把類變了 : HTMLDocumentClass => HTMLDocument,HTMLBodyClass => HTMLBody。
這樣就在客戶機子上不用裝VS均可以了,至於爲何這麼改就能夠,暫時不得而知,最近實在忙。沒時間深究。
解決:COM 組件的調用返回了錯誤 HRESULT E_FAIL
這個東西總在Browser.Document時發生,通過查看,發現Document的狀態始終都爲未加載完畢時(實際上已加載完畢,客戶機子IE8 XP)就會出現此錯誤。
不要用這個屬性了,經過LocalhostUrl屬性判斷是否這個頁面(就是說盡可能避開這個Document,有無解Bug)。