最近的一个B/S系统中,用到了指模录入,当用户按了手指摸之后,要在IE浏览器的一个文本框上显示用户的姓名。由于要监控指模机的输入,因此客户端需要装一个.net控制台程序,通过此控制台程序监控指模机。这个没办法。这个.net控制台程序装在公司前台的电脑上就OK了。然后通过局域网与指模机相联,当用户按手指摸并且验证通过之后,从指模机读取用户的姓名,然后检测当前浏览器是否有打开系统上的某个页面。如果有,则将姓名输入到IE浏览器的响应文本框。
这里用到的最麻烦的一个东东就是C#操作IE浏览器。之前太孤陋寡闻,一开始的想法是控制台程序发送上远程服务器,然后页面AJAX轮询,但是耗用比较大的资源。下面主要通过com组件实现控制台程序操作IE。
1、首先,需要添加com组件的引用
- 加入对Microsoft Internet Controls的引用;
- 加入对Microsoft HTML Object Library的引用;(其实就是的mshtml)
2、打开一个新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浏览器,打开指定页
3、操作js
下面,通过操作js实现如下效果:往百度搜索框里面输入"刘德华"并点击搜索。
//遍历所有选项卡 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); } } }
4、C#直接通过DOM操作IE
C#直接通过Dom操作IE
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(); } }
5、在里面操作IFrame
操作IFrame是一个比较麻烦的操作,很多方式都不能实现,目前唯一的办法是通过在页面上执行一段js实现操作IFrame(希望有人能告诉我)。