按鍵精靈指令碼教程:單執行緒操作多視窗?

不開多執行緒,在單執行緒內如何對多個視窗分別進行操作,以實現多開目的?讓我們一起來了解了解~~

工具/原料

按鍵精靈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

教程, 物件, 指令碼, 按鍵精靈, 多視窗,
相關問題答案