不開多執行緒,在單執行緒內如何對多個視窗分別進行操作,以實現多開目的?讓我們一起來了解了解~~
工具/原料
按鍵精靈2014
方法/步驟
內容提要
本例中,講解的是使用大漠外掛,通過建立多個大漠物件,切換大漠物件對多視窗分別進行操作。
『1』 獲取要繫結的視窗控制代碼,存放在視窗控制代碼陣列中。『2』 有幾個視窗就建立幾個大漠物件。『3』 建立一個公用物件,用於切換。『4』 迴圈切換大漠物件,分別繫結對應的視窗。『5』 迴圈切換大漠物件,分別操作對應的視窗。
獲取視窗控制代碼
1、迴圈等待按鍵,如果按下的是F7鍵,則獲取當前滑鼠指向的視窗控制代碼。2、獲取視窗控制代碼存放到視窗控制代碼陣列中。3、如果按下的是F8鍵,則退出do迴圈,繼續後續的操作。
『程式碼』
Dim hwnd_all(100)//當我們不知道使用者會啟動多少個視窗的時候,可以把陣列定義大一點。
Do While key <> 119 //沒有按下F8則進入迴圈
Key = WaitKey() //等待按鍵並且獲取按鍵碼
If key = 118 Then //如果按下F7則 將變數js加1
js=js+1
hwnd_all(js) = Plugin.Window.MousePoint() //獲取當前滑鼠指向的視窗的視窗控制代碼存放到陣列hwnd_all中
End If
Loop
『分析』
◎ Do While key <> 119 Do迴圈分為前判斷和後判斷, 它們的區別在於,前判斷是先判斷條件符不符合然後進入迴圈體, 而後判斷是先進入迴圈體執行一次之後再進行判斷: 前判斷: Do while 條件 Loop 後判斷: Do Loop while 條件
"{�pg�E02�idow-orphan; text-align:left; " > End If
Loop
建立大漠物件
“剛接觸大漠的童鞋可能對於物件的概念比較模糊。其實作為一個單純的使用者,暫時不需要去了解更深的原理。咱們只需知道想要用大漠的命令,就要拿到它的使用權。而建立大漠物件就是獲取使用權的步驟。
有沒有童鞋是這樣認為的:覺得大漠的命令一定是 dm.moveto x,y 或者 dm.ver 認為一定要以dm.什麼的形式來使用命令 其實不是這樣的,你可以這樣使用大漠命令,xx.moveto x,y 或者 oo.moveto x,y 咱高興用什麼就用什麼。這個取決於我們建立大漠物件時所命名的物件名。『例如』 我們建立一個大漠物件,命名為ha : Set ha = createobject("dm.dmsoft") 那麼,咱們在使用大漠命令的時候,就應該這樣使用: ha.moveto x,y『語法』 Set 物件 = createobject("dm.dmsoft") //建立大漠物件 物件.moveto x,y //使用命令
我們現在回到例子中,一個視窗對應建立一個大漠物件。視窗和物件之間的關係要怎麼理解呢?為什麼不多個視窗共用一個物件呢?
『例如』
咱們是一家擁有上千保姆的家政公司。一個家庭比作一個視窗,一個保姆比作一個物件。咱們把保姆派到一個家庭之後,保姆才能接收並且執行咱們下達的命令。一個保姆對應一個家庭,輕輕鬆鬆。但是當一個保姆要對應10個家庭,她要怎麼辦呢?這家擦了個地板又跑到那家擦個玻璃。一個物件在第一個視窗執行了一個動作解綁之後繫結第二個視窗,第二個視窗執行一個動作解綁,然後再去繫結第三個視窗……繫結和解綁是非常耗費系統資源的,所以這裡不提倡這種做法。
『程式碼』
// 宣告物件(有幾個視窗宣告幾個)
ReDim dm_all(js)
For i= 1 to js
// 分別建立物件,物件存放在陣列中
Set dm_all(i) = createobject("dm.dmsoft")
Next
『注意』 按鍵中不支援陣列形式物件直接使用命令,例如: dm_all(0).moveto x,y 不支援這樣使用。『所以』我們需要建立一個公用的物件,用於將陣列形式的物件轉為變數名形式的物件,作為物件切換的一個容器。
//////宣告公共物件,用於切換//////
Set dm = nothing //建立空的物件
切換物件繫結視窗
有多少個視窗就迴圈幾次繫結視窗,咱們的視窗數量是js, 迴圈js次,程式碼如下:
『程式碼』
For i = 1 To js
Call 切換物件(i)
dm_ret = dm.BindWindow(hwnd_all(i), "dx", "windows", "windows", 0)
// 檢測返回值
If dm_ret = 0 Then
MessageBox "繫結失敗"
EndScript
End If
// 分別設定路徑字型檔等
// Call 切換物件(i)
// dm.SetPath "c:\test"
// dm.SetDict 0,"test.txt"
Next
Sub 切換物件(index)
Set dm = dm_all(index)
End Sub
『分析』 ◎ 進入for迴圈呼叫子程式 “切換物件”,把i的值傳遞給子程式。 ◎ “切換物件”子程式中將當前的大漠物件 ,dm_all(index) 賦值給 dm ◎ 返回到for迴圈中,繫結對應的視窗。
操作
指令碼的主迴圈,通過不斷的切換物件,向對應的物件下達操作,從而實現指令碼多開的目的。但是需要注意一點,由於是切換物件進行操作的,所以對這些視窗的操作並不是同時進行的。第一個視窗執行完之後才會第二個視窗,順延下去。
『程式碼』
// 指令碼主迴圈
Do
For i = 1 To js
Call 切換物件(i)
Call 操作(i)
Delay 1000
Next
Loop
Sub 操作(index)
dm.SendString hwnd_all(index),index
dm.keypress 13
End Sub
整體程式碼
Call 大漠註冊()
///////獲取要繫結的視窗控制代碼////////
Dim hwnd_all(1000 )
Do While key <> 119
Key = WaitKey()
If key = 118 Then
js=js+1
hwnd_all(js) = Plugin.Window.MousePoint()
TracePrint hwnd_all(js)
End If
Loop
///// 宣告物件(有幾個視窗宣告幾個)
ReDim dm_all(js)
For i= 1 to js
// 分別建立物件
Set dm_all(i) = createobject("dm.dmsoft")
Next
//////宣告公共物件//////
Set dm = nothing
/////////// 分別繫結視窗///////////////
For i = 1 To js
Call 切換物件(i)
dm_ret = dm.BindWindow(hwnd_all(i), "dx", "windows", "windows", 0)
// 檢測返回值
If dm_ret = 0 Then
MessageBox "繫結失敗"
EndScript
End If
// 分別設定路徑字型檔等
// Call 切換物件(i)
// dm.SetPath "c:\test"
// dm.SetDict 0,"test.txt"
Next
/////////// 指令碼主迴圈///////////////
Do
For i = 1 To js
Call 切換物件(i)
Call 操作(i)
Delay 200
Next
Loop
Sub 切換物件(index)
Set dm = dm_all(index)
End Sub
Sub 操作(index)
dm.SendString hwnd_all(index),index
dm.keypress 13
End Sub
///////// 分別解綁視窗//////////
Sub OnScriptExit()
For i = 1 To js
Call 切換物件(i)
dm_ret = dm.UnBindWindow()
Next
End Sub
/////////////註冊大漠外掛///////////
Sub 大漠註冊()
Set ws = createobject("Wscript.Shell")
ws.run "regsvr32 atl.dll /s"
Set ws = nothing
PutAttachment "c:\guoer", "dm.dll"
PutAttachment ".\Plugin" ,"RegDll.dll"
call Plugin.RegDll.Reg ( "c:\guoer\dm.dll")
Set dm = createobject("dm.dmsoft")
ver = dm.ver()
If len(ver) = 0 Then
MessageBox "外掛註冊失敗,檢查系統是否禁用了vbs指令碼許可權"
EndScript
End If
End Sub