网页外挂的总结

来源:互联网 发布:slam导航算法 编辑:程序博客网 时间:2024/06/10 01:59

      我每天要重复着几乎一样的登录、点菜单、输入查询条件、得到查询数据,流程十分枯燥,所以想到了喜欢写点小程序的爱好,做一个自动化的工具,为自己放松放松。单位的系统是WS结构的,这个自动化的工具本质上就是一个网页外挂。经过了两个多月的摸索,学了不少新东西,这两天核心工作就可以结束,写个总结与大家分享。

      原以为掌握了WebBrowser,就可以完成任务,没想随着工作的深入,做了两个月后,竟然要用到API,这可是我原来最头大的活儿,而且因为API有好多预定义的符号,在C#中没法直接用,要改成C#能够识别的数据类型,光处理这些数据类型就够让人烦躁的了。

      一、我的指导思想

 

      不想当黑客,只想把手工动作尽量自动化,我的工具只是充分利用工作系统的客户端提供给我的一切合法功能,不进行工作系统允许之外的任何尝试。因此我的工具与已有的工作系统可以看作是一具三层的结构:我的工具(客户层)——工作系统的客户端(应用服务层)——工作系统的服务端(数据服务层)

 

      二、WebBrowser控件:

 1.得到网页页面

HtmlDocument doc = WebBrowser1.Document;

 2.填写表单

HtmlElement elem = doc.GetElementById("idname");

elem.SetAtrribute("Value","自动填写");

或者

elem.OuterText = "自动填写";

3.提交表单

doc.Forms["loginForm"].InvokeMember("submit");

         ……

         (是两个星期前的经历了,先放一下)

 

      三、API的使用:

 

      WebBrowser其实已经提供了几乎所有的网页操作控制功能,从页面元素获取、操作,到访问框架页面下的子页面,再到页面的脚本执行——至少在我碰到的对页面的处理需求中还没有超出WebBrowser功能之外。不过对于弹出的新的网页窗口,WebBrowser就没有控制能力了,当无法避免弹出新网页窗口时,就只好先找到这个新窗口,再找到这个新窗口的页面对象,然后我们才能对这个页面进行操作了。而查找窗口及窗口中的控件这种功能就只有依靠API来完成了

 

      首先,要找到窗口句柄(有三种左右的方法)

      1.Process.GetProcessesByName() + Process[i].MainWindowHandle

      2.FindWindow()

 

        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        ……

       

        public IntPtr 窗口句柄;

 

        ……

        string 窗口名 = "你自己找——别告诉我你找不到";

        窗口句柄 = FindWindow(null, 窗口名);

 

 

      其次,通过窗口句柄取得网页页面的对象(IHTMLDocument2)

      第1步:EnumChildWindows()+回调函数

      第2步:RegistetWindowMessage()/SendMessageTimeout()/ObjectFromLresult()

      第三,有了网页页面的对象,就可以根据自己的需要处理页面元素了

(先写这么多,具体代码待我完成后再补充)

有人问代码,花了点时间把相关代码提出,放到资源下载里——赚点下载用分,哈哈,别介意。


====不好意思,本人实在太懒,一直没更新,这次是程序运行出现了问题,在这做个记录========

在程序中我可以用下代码调用网页上的按钮功能

workWin = Document.Window.Frames["frame_button"] ;

workWin.Document.GetElementById("outpu").RaiseEvent("OnClick");

自动调用网页的按钮对象