Banner Access
Tekst informacyjny o polityce Cookies Close   
BraListWind wielkość: 57 KB. Status: free

Lista okien potomnych okna dialogowego
" Ustawienia strony " dla raportu.

  1. Wyszukuje okna na równorzędnym poziomie i niższym oraz ich potomków.
  2. 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".