写这篇文章,是由于这种动作式外挂不用到封、拆解包技术,不修改原程序本身内存数据,只是利用底层API实现常规上的鼠标、键盘操作,自动在系统内填入指定的数据后自动提交。这就不存在法律上的问题,这个程序已经实现了预期需求的95%以上,剩余的部分留给有意的人自己去逐莫吧。好了,言归正转。开始了。
首先用SPY++分析窗口。得知窗口是由四个子窗口组成。
继续分析,可以得知每个窗口的Z序列、标题、进程ID、矩形坐标等信息。具体的分析过程就不多说了,各位自己逐摸技巧吧。
首先用FindWindow 找到MDI父窗口,然后再用FindWindowEx 根据父窗口句柄查找子窗口,再用EnumChildWindows 枚举子窗口上的所有子窗口(其实就是按Z序排列的控件了,哈哈),
然后赋值就可以了。
上面的代码就是找到需要填值的控件的句柄后,用 sendMessage 发送消息就可以了。具体发送的消息类型可以在我其它的文章中看到。 注意,有些时候要用PostMessage 来发送消息,因为有sendMessage 有时会因为业务系统的缓慢,导致程序失去反应。具体关于sendMessage 和PostMessage 的区别,各位自己逐模吧。
通过枚举之函口,传入入口函数地址。
递归从窗口的Z序列排列,列出窗口。然后把句柄取出。
SendMessage(StrToInt(wndal[4]),CB_SELECTSTRING,0,LPARAM(PChar('(02)在校注册的中小学生')));
SendMessage(StrToInt(wndal[5]),WM_SETTEXT,0,LPARAM(PChar('(02)在校注册的中小学生')));
给combobox赋值的时候,要注意分析,combobox是由一个 TsysCodeComboBox 和一个Edit 组成,需要同时给TsysCodeComboBox 和Edit同时赋值,给TsysCodeComboBox 赋值可以通过发送CB_SELECTSTRING 消息。
Delphi 的TsysDBGrid 窗口是一个整体,如何拆分得到具体的行信息,还需要进一步研究,目前我们可以模拟鼠标的单击动作来得到TsysDBGrid的动作。通过向TsysDBGrid 发送WM_LBUTTONDOWN和WM_LBUTTONUP 消息,模拟鼠标的一次单击。注意两个消息要一起哦。
最后一个参数是X,Y坐标系的X,Y值,是从句柄的左上角开始。
到此,模拟自动录入的功能基本上就实现了。具体根据Excel清单逐条自动录入提交,各位自己逐模吧。