天天看點

autohotkey-大漠插件

大漠插件如何注冊?

點選這個bat檔案即可,

autohotkey-大漠插件

若是成功的話會顯示

autohotkey-大漠插件

大漠插件為什麼一直注冊不成功?

1.大漠插件不支援64位,autohotkey應該使用32位的

2.注意應該将ahk檔案和大漠的dm.dll檔案放到同一個檔案夾下面才可以。

如何用程式驗證大漠插件是否注冊成功?

#SingleInstance force			;;執行程式前先關閉程式

dm:=ComObjCreate("dm.dmsoft") ;此處:=表示表達式傳回值指派給變量dm
ver := dm.ver() ;調用大漠的插件版本查詢函數,隻會出現兩種情況傳回值為空及傳回值為版本号。

if (ver) ;如果版本号存在
MsgBox,,,注冊成功!版本号為%ver%,1
else 
MsgBox,,,注冊失敗!`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%,1
return 
           

初始化配置

a:=dm.SetPath("") ;設定路徑,若為空的話是設定為目前路徑
b:= dm.SetDict(0,"zk.txt")  ;設定字庫檔案
           

通過視窗類名和視窗标題獲得句柄

#s::
hwnd_1 := dm.FindWindow("Notepad","無标題 - 記事本") ;獲得頂層視窗的句柄,第一個參數為視窗類名,第二個為視窗标題
msgbox, , ,頂級句柄為`:%Hwnd_1%,1

hwnd_2 :=dm.FindWindowex(hwnd_1,"Edit","")		;獲得次級視窗的句柄,第一個參數為父級句柄,第二個為視窗類名,第三個為視窗标題
msgbox, , ,次級句柄為`:%Hwnd_2%,1
return 
           

如何綁定視窗

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.5
msgbox, % "圖檔位于:" 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.5
msgbox, % "顔色位于:" 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.5
msgbox, % "文字位于:" x[] "," y[]
dm.moveto(x[],y[])

Return  
           

注意這個色偏移不能太大,也不能太小。太大的話是導緻識别不準确,太小的話可能會因為意外情況而導緻識别不到。

綁定視窗之後在一個視窗上面找字

#w::		;;找字

Hwnd:=dm.getmousepointwindow() ;擷取滑鼠所在的視窗句柄
msgbox,% Hwnd 

state := dm.bindwindow(hwnd,"normal","normal","normal",0)  ;綁定視窗
MsgBox,,,綁定成功!,0.5

x:=ComVar()
y:=ComVar()
state := dm.FindStr(0,0,2000,2000,"我的首頁","ffffff-000000",0.95,x.ref,y.ref)
msgbox,, ,找到的文字狀态為`:%state%,0.5
msgbox, % "文字位于:" x[] "," y[]
dm.moveto(x[],y[])


;~ dm.moveto(203,273)

Return  
           

百度雲的enter鍵改為滑鼠點選

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.Unbindwindow

return