Lista okien potomnych okna dialogowego
" Ustawienia strony " dla raportu.
- Wyszukuje okna na równorzędnym poziomie i niższym oraz ich potomków.
- Tworzy listę zwierającą: uchwyt okna, klasę okna, tekst okna oraz Identyfikator okna.
Przykład ten powstał we wstępnej fazie prób odczytu i zmiany opcji wydruku w oknie dialogowym " Ustawienia strony " wywoływanym przez:
DoCmd.RunCommand acCmdPageSetup.
Poniżej opisuję krok po kroku, w jaki sposób doszedłem do poznania struktury okna Ustawienia strony. W miarę możliwości starałem się przedstawić pełny opis używanych tutaj funkcji API. Mam nadzieję, że ten przykład i następny okażą się pomocne dla miłośników zgłębiania sekretów okien Windowsowych.
Znalezienie uchwytu aktywnego okna umożliwia nam funkcja:
- Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Sub btnGetFocus_Click()
Dim hWind As Long
- ' hWind jest uchwytem okna Accessa równym Application.hWndAccessApp
hWind = GetActiveWindow
- End Sub
Jeżeli potrzebny jest nam uchwyt formantu TextBox, ListBox, ComboBox to możemy go uzyskać poprzez ustawienie na nim fokusu i pobranie jego uchwytu za pomocą funkcji:
- Private Declare Function GetFocus Lib "user32" () As Long
Private Sub btnGetFocus_Click()
Dim hWind As Long
- Me.TextBox.SetFocus
hWind = GetFocus
- End Sub
Tekst okna (tytuł )uzyskać możemy następująco:
- Private Declare Function GetWindowText Lib "user32" Alias _
- "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, _
ByVal cch As Long) As Long
Private Function zbGetTitleWind(hWind As Long) As String
Dim sBfTitle As String
Dim lRet As Long
Const cBf As Long = 256
- ' Przygotuj i zapełnij bufor
sBfTitle = String(cBf, vbNullChar)
' Pobierz tytuł okna
lRet = GetWindowText(hWind, sBfTitle, cBf)
zbGetTitleWind = Left$(sBfTitle, lRet)
- End Function
Inny sposób, bez przewidywania wielkości buforu na tekst okna:
- Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" _
- ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
- Private Const WM_GETTEXTLENGTH = &HE
Private Const WM_GETTEXT = &HD
Private Function zbGetTextWind(hWind As Long) As String
Dim sBfText As String
Dim lBf As Long
Dim lRet As Long
- ' pobierz długość tekstu
lBf = SendMessage(hWind, WM_GETTEXTLENGTH, ByVal 0, ByVal 0)
' zrób dodatkowe miejsce na oznaczenie końca stringu
lBf = lBf + 1
' przygotuj i zapełnij bufor
sBfText = String(lBf, vbNullChar)
' pobierz tekst okna i długość tekstu
lRet = SendMessage(hWind, WM_GETTEXT, ByVal lBf, ByVal sBfText)
zbGetTextWind = Left$(sBfText, lRet)
- End Function
Nazwę klasy okna otrzymamy dzięki funkcji:
- Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
- (ByVal hWnd As Long, ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Private Function zbGetClassWind(hWind As Long) As String
Dim lRet As Long
Dim sBfClass As String
Const cBf As Long = 256
- ' przygotuj i zapełnij bufor
sBfClass = String(cBf, vbNullChar)
' pobierz nazwę i długość tekstu
lRet = GetClassName(hWind, sBfClass, cBf)
zbGetClassWind = Left$(sBfClass, lRet)
- End Function
a identyfikator okna stosując funkcję:
- Private Declare Function GetDlgCtrlID Lib "User32" (ByVal hWnd As Long) As Long
Private Function zbGetIDWind(hWind As Long) As Long
- zbGetIDWind = GetDlgCtrlID(hWind)
- End Function
Uchwyty następnych okien uzyskamy dzięki funkcji:
- Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, _
- ByVal wCmd As Long) As Long
- Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5
' Procedura poniższa wyświetla w oknie analizy programu dane okien dzieci
' okna o uchwycie hWind
Private Sub zbInfoWind(hWind (hWind As Long)
Dim hNext As Long
- ' Pobierz uchwyt dziecka
hNext = GetWindow(hWind, GW_CHILD)
' Wykonaj dla wszystkich okien dzieci okna hWind
Do Until hNext = 0
- Debug.Print "Uchwyt okna: " & hNext
Debug.Print "Tytuł okna: " & zbGetTextWind(hNext );
Debug.Print "Klasa okna: " & zbGetClassWind(hNext );
Debug.Print "Identyfikator: " & zbGetIDWind(hNext );
Debug.Print "============================"
' Pobierz uchwyt następnego okna dziecka
hNext = GetWindow(hNext, GW_HWNDNEXT)
- Loop
- End Sub
Znając podstawowe funkcje API działające na oknach na <<następnej>> stronie zapoznamy się szczegółowo ze strukturą okna dialogowego "Ustawienia strony".