使用大漠插件操作VB程序
2017-04-23 00:46
176 查看
有一个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等无法获取时,或者是绘制的控件无法获取时,就只能从屏幕上面的颜色图形文字识别入手。
多年前碰到一个需求说往网页中自动填资料的或许也可以用这个插件来实现。
数字式的文件夹
在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等无法获取时,或者是绘制的控件无法获取时,就只能从屏幕上面的颜色图形文字识别入手。
多年前碰到一个需求说往网页中自动填资料的或许也可以用这个插件来实现。
相关文章推荐
- asp.net使用jbox插件,利用ajax(使用一般处理程序方式)执行撤销操作
- 操作select的jquery插件 注意:使用时请保持JS文件的编码和你程序的编码一致...
- VB.NET使用接口实现附带插件功能的程序
- Eclipse 和 Vim 协同使用---使用Eclim插件开发Python程序
- 关于SubSonic3.0插件使用Json反序列化获得的实体进行更新操作时,只能执行添加而不能执行修改(编辑)操作的处理
- 关于SubSonic3.0插件使用Json反序列化获得的实体进行更新操作时,只能执行添加而不能执行修改(编辑)操作的处理
- 使用Maven 插件 cxf-codegen-plugin生成WebService测试程序
- windows下不需要插件使用MyEclipse运行hadoop2.6.0 MapReduce程序。
- 使用POI插件对EXCEL 进行操作RecordFormatException:unable to construct record instance异常
- VB使用ADODB操作数据库的常用方法
- 在C#程序中直接使用VB.NET中丰富的函数
- 在微信小程序中使用富文本转化插件wxParse
- 微信小程序富文本插件wxParse的使用
- [VB.NET]点net写client程序传递参数给mssql存储过程insert,为什么要反复执行客户端代码才能成功insert,怎么才能使客户端插入记录操作变得稳定呢?
- [VB.NET]各们,请问如何使用vb.net编写两个进程间消息通信的程序啊
- Java程序使用HASP加密狗加密保护的操作步骤--手把手包你学会
- 【Eclipse中的 Git插件使用】简单操作
- 使用vb.net等待外部程序运行完毕才继续
- 怎么让vb编写好的程序生成独立的文件啊,在其他电脑上也能独立使用?
- 如何在VB中操作EXCEL(一段代码,两个可以使用的过程)