視窗工具模組

尋找特定目標的視窗 hWnd
尋找自己的 hWnd
取得視窗文字
取得函數在記憶體上的位置
取得列舉視窗內容
取得執行代號
設定程式在最頂端 (Always on Top)
Windows 內建訊息盒的使用
取得視窗類別名稱
取得視窗執行檔名稱
取得列舉子視窗內容

尋找特定目標的視窗 hWnd

函數 引數 傳回值 說明
FindWindowTitle 字串 hWnd 傳回與設定字串相同的視窗標題 (Caption) 視窗代碼,若有兩個以上同名,則傳回第一個搜尋到的視窗
FindWindowClass 字串 hWnd 傳回與設定類別相同的視窗類別視窗代碼,若有兩個以上同類別,則傳回第一個搜尋到的視窗

範例:

hWnd=FindWindowTitle(Me.Caption) ' 與 Me.hWnd 同
hWnd = FindWindowClass("XLMAIN") ' 若 Excel 已開啟則傳回 Excel 的視窗代碼,否則傳回 0

設定程式在最頂端 (Always on Top)

副程式 hWnd wFlags OnTop 說明
SetAlwaysOnTop 視窗代碼 可省略 True (預設)
或 False
雖然有點俗氣,不過我喜歡這樣用,對我也比較方便

範例:

SetAlwaysOnTop Me.hWnd,,True ' 設定在最頂端
SetAlwaysOnTop Me.hWnd,,False ' 取消設定在最頂端

尋找自己的 hWnd

函數:myHWnd

說明:

在 Form 可以用 Me.hWnd 取得本身的 hWnd,但是在模組內卻不行,所以先尋找與 App.Title 相同的 hWnd,若找不到,則假設程式本身正在作用中,取得正在作用中的 hWnd,若無正在作用中的 hWnd,則取得前一個作用中的 hWnd,此方法可能還是有隱藏的 Bug ,若已知 Form.Caption ,則用 FindWindowTitle(Form.Caption) 會較好

隱藏的 Bug:

  1. 視窗標題不見得與專案抬頭相同
  2. 程式不見得正在作用中

範例:

hWnd = myHWnd

Windows 內建訊息盒的使用

函數 lpText wType lpCaption hWnd 說明
Win32MsgBox 說明字串 同 MsgBox,可省略 標題
可省略
代碼
可省略
在編譯後會較 VB MsgBox 為小,且不會使 VB 程式暫停執行

範例:

If Win32MsgBox("請按是或否", vbYesNo)=vbYes Then
 Debug.Print "你按下是"
Else
 Debug.Print "你按下否"
End if

取得視窗文字

函數名:myGetWindowText,傳回值為字串

引數 類型 說明
hWnd 必要 需取得文字的視窗代號

範例:

Debug.Print myGetWindowText(Me.HWnd) ' 傳回值為視窗標題 Form1

說明:

對於一般有標題的視窗通常為 Caption 的值

取得視窗類別名稱

函數名:myGetClassName,傳回值為字串

引數 類型 說明
hWnd 必要 需取得類別名稱的視窗代號

範例:

Debug.Print myGetClassName(Me.HWnd) ' 傳回值為視窗標題 ThunderForm

取得函數在記憶體上的位置

函數名:myAddressOf,傳回值為長整數

引數 類型 說明
hAddress 必要 需取得回呼函數記憶體位置 AddressOf funcName

範例:

Debug.Print myAddressOf(AddressOf PaintHook) ' 傳回值為記憶體位置長整數

說明:

在使用 Windows API 各函數中常常會碰上回呼函數,若在函數的引數上有回呼函數的記憶體位置引數,那好解決,只要在參數列打入 AddressOf CallBackProc 即可,比如說列舉視窗的回呼方式:

EnumWindows AddressOf EnumWindowsProc, lParam

但若碰上在資料型態內需要設定回呼函數的記憶體位置,比如說在使用共用對話盒的 PageSetupDlg 函數,必須設定 .lpfnPagePaintHook 值,但是 AddressOf 不允許下面的用法:

.lpfnPagePaintHook = AddressOf PaintHook

因此耍一個小詐就可以把回呼函數的記憶體位置騙回來:

.lpfnPagePaintHook = myAddressOf(AddressOf PaintHook)

取得視窗執行檔名稱

函數名:myGetWindowModuleFileName,傳回值為字串

引數 類型 說明
hWnd 必要 需取得執行檔的視窗代號

範例:

Debug.Print myGetWindowModuleFileName(Me.hWnd)
' 傳回值為執行檔完整長檔名 C:\PROGRAM FILES\DEVSTUDIO\VB\VB5.EXE

說明:

本函數支援 Windows 98 以上系統,若在 IDE 環境中, VB 為執行母體,則傳回 VB 程式

取得列舉視窗內容

函數名:myEnumWindows,傳回列舉視窗陣列

引數 類型 說明
enumType 可省略 enu_EW_hWnd,傳回視窗代號陣列
enu_EW_Text,傳回視窗標題文字陣列
enu_EW_Class,傳回視窗類別文字陣列
enu_EW_ModuleFileName,傳回視窗執行檔文字陣列
enu_EW_OnlyVisible,只傳回可顯示的視窗陣列
enu_EW_OnlyParentWindow,只傳回母體的視窗陣列

範例:

ew=myEnumWindows(enu_EW_ModuleFileName or enu_EW_OnlyParentWindow or enu_EW_OnlyVisible)
For i=LBound(ew) To UBound(ew): ? ew(i): Next i
' 傳回值為只顯示在螢幕上且為母體的執行檔完整長檔名的文字陣列

說明:

傳回視窗執行檔文字呼叫之函數僅支援 Windows 98 以上系統,若在 IDE 環境中, VB 為執行母體,則傳回 VB 程式

取得列舉子視窗內容

函數名:myEnumChildWindows,傳回列舉子視窗陣列

引數 類型 說明
hWndParent 必要 視窗母體的視窗代號
enumType 可省略 enu_EW_hWnd,傳回視窗代號陣列
enu_EW_Text,傳回視窗標題文字陣列
enu_EW_Class,傳回視窗類別文字陣列
enu_EW_ModuleFileName,傳回視窗執行檔文字陣列
enu_EW_OnlyVisible,只傳回可顯示的視窗陣列
enu_EW_OnlyParentWindow,只傳回母體的視窗陣列

範例:

ew=myEnumChildWindows(enu_EW_hWnd Or enu_EW_OnlyVisible)
For i=LBound(ew) To UBound(ew): ? ew(i): Next i
' 傳回值為只顯示在螢幕上的子視窗代號陣列

說明:

傳回視窗執行檔文字呼叫之函數僅支援 Windows 98 以上系統,若在 IDE 環境中, VB 為執行母體,則傳回 VB 程式

取得執行代號

函數名:myGetInstance,傳回視窗執行代號 (hInstance)

引數 類型 說明
hWnd 長整數 視窗代號

範例:

Debug.Print myGetInstance(Me.hWnd) ' 與 App.hInstance 相同