尋找特定目標的視窗
hWnd 尋找自己的 hWnd 取得視窗文字 取得函數在記憶體上的位置 取得列舉視窗內容 取得執行代號 |
設定程式在最頂端
(Always on Top) Windows 內建訊息盒的使用 取得視窗類別名稱 取得視窗執行檔名稱 取得列舉子視窗內容 |
函數 | 引數 | 傳回值 | 說明 |
FindWindowTitle | 字串 | hWnd | 傳回與設定字串相同的視窗標題 (Caption) 視窗代碼,若有兩個以上同名,則傳回第一個搜尋到的視窗 |
FindWindowClass | 字串 | hWnd | 傳回與設定類別相同的視窗類別視窗代碼,若有兩個以上同類別,則傳回第一個搜尋到的視窗 |
範例:
hWnd=FindWindowTitle(Me.Caption) ' 與 Me.hWnd 同
hWnd = FindWindowClass("XLMAIN") ' 若 Excel 已開啟則傳回 Excel 的視窗代碼,否則傳回 0
副程式 | hWnd | wFlags | OnTop | 說明 |
SetAlwaysOnTop | 視窗代碼 | 可省略 | True (預設) 或 False |
雖然有點俗氣,不過我喜歡這樣用,對我也比較方便 |
範例:
SetAlwaysOnTop Me.hWnd,,True ' 設定在最頂端
SetAlwaysOnTop Me.hWnd,,False ' 取消設定在最頂端
函數:myHWnd
說明:
在 Form 可以用 Me.hWnd 取得本身的 hWnd,但是在模組內卻不行,所以先尋找與 App.Title 相同的 hWnd,若找不到,則假設程式本身正在作用中,取得正在作用中的 hWnd,若無正在作用中的 hWnd,則取得前一個作用中的 hWnd,此方法可能還是有隱藏的 Bug ,若已知 Form.Caption ,則用 FindWindowTitle(Form.Caption) 會較好
隱藏的 Bug:
- 視窗標題不見得與專案抬頭相同
- 程式不見得正在作用中
範例:
hWnd = myHWnd
函數 | 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 相同