博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
掩耳盗铃之使用WebBrowser封装网页
阅读量:6068 次
发布时间:2019-06-20

本文共 1654 字,大约阅读时间需要 5 分钟。

  最近学校的破网越来越不像话了,换了这Win7机器后,Dr.Com就一直掉,换了各种版本,也不行,无奈,我只得换成了网页登录模式。但是这上网还要开个网页不能关,无形中增加了我对电脑整洁度的恶评,所以,我决定封装这个丑陋的界面:

  使用WebBrowser控件用来加载这个页面,且设置Visibility="Hidden" 让它不显示,就行了。

WB_Client.Source = new Uri("http://"+"192.168.20.1");

  上面便是加载页面的方法,WB_Client是控件名,192.168.20.1是学校服务器的IP。

 

  接下来便是提取页面中的元素了:用户名框、密码框、确认按钮、注销按钮,需要用到Microsoft.mshtml.dll,它在C:\Program Files\Microsoft.NET\Primary Interop Assemblies下。添加引用后:  

_htmlDoc = WB_Client.Document as mshtml.IHTMLDocument2;

  便能取到页面的Document了,然后使用Chrome或者Firefox在浏览器上分别获取这些控件的标识,如id、name等,在后台通过DOM获取这些控件:

mshtml.IHTMLElement element = _htmlDoc.all.item("DDDDD");

  其中DDDDD就是控件的id或者name属性值,得到的element有三个必用的方法:getAttribute、setAttribute、click。不用多说了吧,可以通过前两个方法,把页面中的值给你的WPF前台中对应的TextBox,或者从前台传到页面。通过click方法可以触发页面中的登录按钮,当单击前台中的“假”Button时,在后台使用这个方法模拟登录。

  如果说这个控件没有id、name怎么办,例如我这登录后的注销按钮是没有名字的,那怎么弄呢?

  使用笨办法吧,遍历,然后对字:

1 mshtml.IHTMLElement element; 2 mshtml.IHTMLElementCollection elements = _htmlDoc.all.tags("input"); 3 foreach (mshtml.IHTMLElement elm in elements) 4 { 5     if (elm.getAttribute("value") != "注销") 6     { 7         element = elm; 8         break; 9     }10 }

 

  好,基础已经有了,那么怎么实现登录状态、数据保存本地呢?WebBrowser有两个非常重要的事件可以帮助解决这些问题:Navigating、LoadCompleted。

  Navigating是在页面开始跳转前触发的,这时我做一个判断,如果能在页面中找到“登录”按钮,就认为这时用户要登录了,便把获取的用户名、密码保存到XML文件中,当然,密码是加密保存的,取出时再解密。

  LoadCompleted是页面跳转后触发的,而且此时WebBrowser的Document已经更新了,如果是用Navigated我发现将发现Document里什么HTML元素也没有。在这个方法中,需要完成的任务包括验证网页的登录状态,设置WPF界面的显示元素等。

  至于其它的功能:是否自动登录、界面自动最少化、自动保存密码、程序托盘图标等,都比较容易实现,来看一下封装后的东西吧:

   虽然也不是很好看,但是通过使用托盘图标类NotifyIcon,我已经可以把这个页面给单独放起来了,也不会因为关闭浏览器而误关了登录会话,够用了。

  转载请注明原址: 

转载于:https://www.cnblogs.com/lekko/archive/2012/09/01/2665653.html

你可能感兴趣的文章
根据调试工具看Vue源码之组件通信(一)
查看>>
Thrift RPC 系列教程(5)—— 接口设计篇:struct & enum设计
查看>>
斯坦福-随机图模型-week1.5
查看>>
灵活的运用Model类
查看>>
hadoop 之分布式安装
查看>>
使用ansible工具部署ceph
查看>>
linux系列博文---->深入理解linux启动运行原理(一)
查看>>
Android反编译(一) 之反编译JAVA源码
查看>>
结合当前公司发展情况,技术团队情况,设计一个适合的技术团队绩效考核机制...
查看>>
python-45: opener 的使用
查看>>
cad图纸转换完成的pdf格式模糊应该如何操作?
查看>>
Struts2与Struts1区别
查看>>
网站内容禁止复制解决办法
查看>>
Qt多线程
查看>>
我的友情链接
查看>>
Ubuntu12.04 编译android源代码及生成模拟器经历分享
查看>>
KVM网络桥接设置方法
查看>>
Puppet学习手册:Puppet Yum安装
查看>>
我的友情链接
查看>>
ansible学习记录
查看>>