有一个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等无法获取时,或者是绘制的控件无法获取时,就只能从屏幕上面的颜色图形文字识别入手。