AutoHotkey 调用 大漠插件 dm.dll
(2018年10月14日修改并测试)作者:徐晓亮 ( aahk )QQ595076941
很久以前的一段代码,贴出来与大家分享,网上ahk调用大漠插件的源代码非常多。
最近事情比较多,感觉比较累,所以源代码编辑和测试可能会暂停一段时间。
;[版本1.0][Win7中等图标测试成功]利用AutoHotkey和大漠插件找图并返回系统全局参数(ByRef按内存地址传递参数)的值 ;按内存地址传递参数的目的是为了实现文件直接的参数传递(例如dll文件的参数值传递给exe或者ahk文件) ;(x在内存地址数组中,不在变量中,x只是一个变参指针,不是变量的值) ;在大漠插件版本2.1233下,Win7中等图标下找图测试成功 ;定义取值函数,变参指针内存地址引用数组形式参数 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._)) } ;注册热键 Ctrl + G ^g:: ;测试用AHK调用大漠插件 ;决定当脚本已经运行时跳过对话框并自动替换旧实例 ;效果类似于 Reload 命令. #SingleInstance Force CoordMode, Mouse, Screen CoordMode, Pixel, Screen SetTitleMatchMode, 2 SetWorkingDir,%A_ScriptDir% ;注册ts插件 RunWait,regsvr32 /i /s "%A_ScriptDir%\dm.dll",,Hide ;创建ts对象 dm:=ComObjCreate("dm.dmsoft") ;设置变参指针数组 a:=ComVar() b:=ComVar() x:=ComVar() y:=ComVar() ;用大漠插件 获取鼠标位置. dm.GetCursorPos(a.ref,b.ref) ;用大漠插件 查找指定区域内的图片 位图必须是24位色BMP格式 dm.FindPic(0,0,2000,2000,"24bmp1.bmp|24bmp2.bmp","000000",0.3,0,X.ref,Y.ref) ToolTip, % "图片位于:" X[] "," Y[] "`n鼠标指针位于:" a[] ","b[] "`n大漠插件版本:"dm.Ver()"`n大漠插件dm.dll的路径:" dm.GetBasePath()"`n剪切板内容:"dm.GetClipboard()"`n网络北京时间:"dm.GetNetTime() if x[]>0 { MouseMove,% x[],y[] MouseMove, 20, 30, 50, r Click 2 } return