作者:我真的爱发明https://blog.csdn.net/u014723479/article/details/104122700
点击这个bat文件即可,
若是成功的话会显示
1.大漠插件不支持64位,autohotkey应该使用32位的
2.注意应该将ahk文件和大漠的dm.dll文件放到同一个文件夹下面才可以。
#SingleInstance force ;;执行程序前先关闭程序dm:=ComObjCreate("dm.dmsoft") ;此处:=表示表达式返回值赋值给变量dmver := dm.ver() ;调用大漠的插件版本查询函数,只会出现两种情况返回值为空及返回值为版本号。if (ver) ;如果版本号存在MsgBox,,,注册成功!版本号为%ver%,1elseMsgBox,,,注册失败!`n请检查ahk版本及大漠是否已注册到系统`n请参考大漠接口说明-常见问题-创建对象失败怎么办,4
以下程序均建立在大漠插件已经正常安装好了的前提下
#k:: ;;dm.MoveR(100,100)Return
!k:: ;;x:=ComVar()y:=ComVar()dm.GetCursorPos(x.ref,y.ref)x :=x[]y :=y[]msgbox,%x% ,%y%Return
dm.MoveTo(100,100)
#a::Hwnd:=dm.getmousepointwindow() ;获取鼠标所在的窗口句柄msgbox, , , %Hwnd%,1return
a:=dm.SetPath("") ;设置路径,若为空的话是设置为当前路径b:= dm.SetDict(0,"zk.txt") ;设置字库文件
#s::hwnd_1 := dm.FindWindow("Notepad","无标题 - 记事本") ;获得顶层窗口的句柄,第一个参数为窗口类名,第二个为窗口标题msgbox, , ,顶级句柄为`:%Hwnd_1%,1hwnd_2 :=dm.FindWindowex(hwnd_1,"Edit","") ;获得次级窗口的句柄,第一个参数为父级句柄,第二个为窗口类名,第三个为窗口标题msgbox, , ,次级句柄为`:%Hwnd_2%,1return
state := dm.bindwindow(hwnd,"normal","normal","normal",0) ;绑定窗口if state = 1 MsgBox,,,绑定成功!,0.5
第一个参数为:指定的窗口句柄。
第一个参数为:屏幕颜色获取方式。
第一个参数为:鼠标仿真模式。
第一个参数为:键盘仿真模式。
第一个参数为:大漠窗口的绑定模式。
dm.Unbindwindow
若是设置了大漠的工作路径的话,就会将截图放到对应的工具文件夹,若是没有设置的话,则会放到当前路径下。
dm_ret := dm.Capture(0,0,2000,2000,"screen.bmp")
Capture(x1, y1, x2, y2, file)
x1 整形数:区域的左上X坐标
y1 整形数:区域的左上Y坐标
x2 整形数:区域的右下X坐标
y2 整形数:区域的右下Y坐标
file 字符串:保存的文件名,保存的地方一般为SetPath中设置的目录
当然这里也可以指定全路径名。
用鼠标拖动截图
long FindPic(x1, y1, x2, y2, pic_name, delta_color,sim, dir,intX, intY)
state := dm.FindPic(0,0,2000,2000,"0.bmp|1.bmp|2.bmp","050505",0.5,0,x,y)
pic_name: 字符串:图片名,可以是多个图片,比如"0.bmp|1.bmp|2.bmp"
delta_color:颜色色差为"203040"表示RGB的色偏分别为 20 30 40(这里是16进制表示)
sim:相似度,取值范围是0.1-1.0
dir:查找方向,0:从左到右,从上到下,1:从左到右,从下到上,2:从右到左,从上到下3:从右到左,从下到上
IntX:变参指针,返回图片左上角的X坐标
IntY:变参指针,返回图片左上角的Y坐标
返回值为找到的图片的序号,从0开始索引,如果没找到返回-1.也就是说,只要返回值不为-1,就一定是匹配上了。
不过上面的这段代码在易语言下面可以运行,但是autohotkey下面是不可以运行成功的。
得加一个函数。
ComVar(Type=0xC){ static base := { __Get: "ComVarGet", __Set: "ComVarSet", __Delete: "ComVarDel" } ; 创建含 1 个 VARIANT 类型变量的数组. 此方法可以让内部代码处理 ; 在 VARIANT 和 AutoHotkey 内部类型之间的所有转换. arr := ComObjArray(Type, 1) ; 锁定数组并检索到 VARIANT 的指针. DllCall("oleaut32\SafeArrayAccessData", "ptr", ComObjValue(arr), "ptr*", arr_data) ; 保存可用于传递 VARIANT ByRef 的数组和对象. return { ref: ComObjParameter(0x4000|Type, arr_data), _: arr, base: base }}ComVarGet(cv, p*) { ; 当脚本访问未知字段时调用. if p.MaxIndex() = "" ; 没有名称/参数, 即 cv[] return cv._[0]}ComVarSet(cv, v, p*) { ; 当脚本设置未知字段时调用. if p.MaxIndex() = "" ; 没有名称/参数, 即 cv[]:=v return cv._[0] := v}ComVarDel(cv) { ; 当对象被释放时调用. ; 必须进行这样的处理以释放内部数组. DllCall("oleaut32\SafeArrayUnaccessData", "ptr", ComObjValue(cv._))}#z:: ;;x:=ComVar()y:=ComVar();用大漠插件 查找指定区域内的图片 位图必须是24位色BMP格式state := dm.FindPic(0,0,2000,2000,"0.bmp|1.bmp|2.bmp","000000",0.3,0,X.ref,Y.ref)msgbox,, ,先找到的图片为`:%state%,0.5msgbox, % "图片位于:" X[] "," Y[]dm.moveto(x[],y[])Return
和找图的方式是一样的
ComVar(Type=0xC){ static base := { __Get: "ComVarGet", __Set: "ComVarSet", __Delete: "ComVarDel" } ; 创建含 1 个 VARIANT 类型变量的数组. 此方法可以让内部代码处理 ; 在 VARIANT 和 AutoHotkey 内部类型之间的所有转换. arr := ComObjArray(Type, 1) ; 锁定数组并检索到 VARIANT 的指针. DllCall("oleaut32\SafeArrayAccessData", "ptr", ComObjValue(arr), "ptr*", arr_data) ; 保存可用于传递 VARIANT ByRef 的数组和对象. return { ref: ComObjParameter(0x4000|Type, arr_data), _: arr, base: base }}ComVarGet(cv, p*) { ; 当脚本访问未知字段时调用. if p.MaxIndex() = "" ; 没有名称/参数, 即 cv[] return cv._[0]}ComVarSet(cv, v, p*) { ; 当脚本设置未知字段时调用. if p.MaxIndex() = "" ; 没有名称/参数, 即 cv[]:=v return cv._[0] := v}ComVarDel(cv) { ; 当对象被释放时调用. ; 必须进行这样的处理以释放内部数组. DllCall("oleaut32\SafeArrayUnaccessData", "ptr", ComObjValue(cv._))}#q:: ;;x:=ComVar()y:=ComVar()state :=dm.FindColor(0,0,2000,2000,"df3f68-050505",0.9,0,x.ref,y.ref)msgbox,, ,找到的颜色状态为`:%state%,0.5msgbox, % "颜色位于:" x[] "," y[]dm.moveto(x[],y[])Return
ComVar(Type=0xC){ static base := { __Get: "ComVarGet", __Set: "ComVarSet", __Delete: "ComVarDel" } ; 创建含 1 个 VARIANT 类型变量的数组. 此方法可以让内部代码处理 ; 在 VARIANT 和 AutoHotkey 内部类型之间的所有转换. arr := ComObjArray(Type, 1) ; 锁定数组并检索到 VARIANT 的指针. DllCall("oleaut32\SafeArrayAccessData", "ptr", ComObjValue(arr), "ptr*", arr_data) ; 保存可用于传递 VARIANT ByRef 的数组和对象. return { ref: ComObjParameter(0x4000|Type, arr_data), _: arr, base: base }}ComVarGet(cv, p*) { ; 当脚本访问未知字段时调用. if p.MaxIndex() = "" ; 没有名称/参数, 即 cv[] return cv._[0]}ComVarSet(cv, v, p*) { ; 当脚本设置未知字段时调用. if p.MaxIndex() = "" ; 没有名称/参数, 即 cv[]:=v return cv._[0] := v}ComVarDel(cv) { ; 当对象被释放时调用. ; 必须进行这样的处理以释放内部数组. DllCall("oleaut32\SafeArrayUnaccessData", "ptr", ComObjValue(cv._))}#w:: ;;找字x:=ComVar()y:=ComVar()state := dm.FindStr(0,0,2000,2000,"易语言","ffffff-05050",0.9,x.ref,y.ref)msgbox,, ,找到的文字状态为`:%state%,0.5msgbox, % "文字位于:" x[] "," y[]dm.moveto(x[],y[])Return
注意这个色偏移不能太大,也不能太小。太大的话是导致识别不准确,太小的话可能会因为意外情况而导致识别不到。
#w:: ;;找字Hwnd:=dm.getmousepointwindow() ;获取鼠标所在的窗口句柄msgbox,% Hwndstate := dm.bindwindow(hwnd,"normal","normal","normal",0) ;绑定窗口MsgBox,,,绑定成功!,0.5x:=ComVar()y:=ComVar()state := dm.FindStr(0,0,2000,2000,"我的主页","ffffff-000000",0.95,x.ref,y.ref)msgbox,, ,找到的文字状态为`:%state%,0.5msgbox, % "文字位于:" x[] "," y[]dm.moveto(x[],y[]);~ dm.moveto(203,273)Return
enter::Hwnd:=dm.getmousepointwindow() ;获取鼠标所在的窗口句柄state := dm.bindwindow(hwnd,"normal","normal","normal",0) ;绑定窗口x:=ComVar()y:=ComVar();用大漠插件 查找指定区域内的图片 位图必须是24位色BMP格式state := dm.FindPic(0,0,2000,2000,"登录.bmp","000000",0.3,0,X.ref,Y.ref)dm.moveto(x[],y[])dm.LeftClick()dm.Unbindwindowreturn
联系客服