有一个VB的程序是操控机器的。需要选择电脑上的文件。需要其他程序直接控制它而不用人工选择。参考了一些资料,说vb控件都是自定义的。参考了window消息也没有类似driverlistbox和dirlistbox的消息ID。故而采用大漠插件用模拟鼠标动作来操作。另外一个考虑是怕原程序的内部触发,用系统消息发送方式传输的结果不正确。毕竟它内部怎么工作的不清楚。
数字式的文件夹
在E盘新建一个0123456789文件夹
因为我们要识别dirlistbox中的文件夹。而且是数字的。我们新建一个字库文件。如上图。然后从dirlistbox中用大漠工具截图如上所示,点提取点阵(多个),然后逐个输入定义文字,并回车(添加到当前字库)。
代码如下:
//查找窗口 long hwnd int runtimes=10 hwnd = dm.FindWindowEx(0,"",wintitle) if hwnd < 1 then run(MainExePath) do while runtimes>0 hwnd = dm.FindWindowEx(0,wintitle) if hwnd >0 then exit sleep(0.5) runtimes -- loop if hwnd < 1 then messagebox("提示","不能启动主程序!") return end if end if dm.SetWindowState(hwnd,12) //定位鼠标到分区控件点击 dm.MoveTo(158,109) dm.LeftClick() dm.MoveTo(158,168) dm.LeftClick() //移动到dirlistbox //移动到第一行位置 dm.MoveTo(158,168) //双击让该控件获得焦点 dm.LeftDoubleClick() //查找文件夹 int wheelcount = 10 string findstr long dm_ret string rets string base_path boolean found = false int lenstr,i int posx[],posy[],pos1,pos2,sub1,sub2 findstr = sle_text.text dm_ret = dm.SetPath(programpath+"/xm") dm_ret = dm.SetDict(0,"zk.txt") do while wheelcount >0 wheelcount -- rets = dm.OcrEx(50,180,250,325,"000000-000000",1.0) //用findstr始终不成功,用它的工具测试时可以的。但是自己调用始终不行。就改用ocr发现挺准识别出文件夹 //是否存在 sub1 = Pos(rets,findstr) sub2 = sub1 + len(findstr) -1 if sub1 >0 then //查找到的字符串样例(是数字的地方“多行”都被识别出来并粘连在一起的,如果不想这样粘连,考虑循环对单行的很窄范围进行识别吧,因我每行的高度固定)
//012345678917000186|56,183|64,183|72,183|80,183|88,183|96,183|104,183|112,183|120,183|128,183|
56,201|64,201|72,201|80,201|88,201|96,201|184,309|192,309 rets += "|" pos1 = Pos(rets,"|") do while true pos2 = Pos(rets,",pos1) if pos2=0 then exit posx[upperbound(posx)+1] = integer(mid(rets,pos1+1,pos2 -pos1 -1)) pos1 = Pos(rets,"|",pos2) if pos1=0 then exit posy[upperbound(posy)+1] = integer(mid(rets,pos2+1,pos1 -pos2 -1)) loop //判断字符串所在位置的坐标是否属于同一行。同一行才符合。 found = true for i = sub1 to sub2 if posy[i] <> posy[sub1] then found = false exit end if next If found Then dm.MoveTo(posx[sub1]+5,posy[sub1]+5) dm.LeftClick() dm.LeftDoubleClick() exit end if end if dm.WheelDown() //太多时滚动鼠标 loop if not found then messagebox("提示","未找到对应的产品目录") end if
总结:感觉挺方便,后续继续深入了解一下。
一些特殊控件无法获取具体的消息ID时;还有像游戏,QQ等无法获取时,或者是绘制的控件无法获取时,就只能从屏幕上面的颜色图形文字识别入手。
多年前碰到一个需求说往网页中自动填资料的或许也可以用这个插件来实现。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|