加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用大漠插件操作VB程序

发布时间:2020-12-17 07:34:19 所属栏目:百科 来源:网络整理
导读:有一个VB的程序是操控机器的。需要选择电脑上的文件。需要其他程序直接控制它而不用人工选择。参考了一些资料,说vb控件都是自定义的。参考了window消息也没有类似driverlistbox和dirlistbox的消息ID。故而采用大漠插件用模拟鼠标动作来操作。另外一个考虑是

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

多年前碰到一个需求说往网页中自动填资料的或许也可以用这个插件来实现。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读