Opis funkcji API GetWindowsLong (...)
Funkcja GetWindowsLong(...) zwraca informacje o określonym oknie o uchwycie hwnd, jak również wartość z określonego przesunięcia do dodatkowej pamięci okna.
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ (ByVal hwnd As Long, _ ByVal nIndex As Long) As Long
- argumenty:
- hwnd
- uchwyt okna i pośrednio do klasy, do której należy okno
- nIndex
-
Przesunięcie (offset) liczony od zera do pobieranej właściwości okna z dodatkowej pamięci okna. Poprawne wartości mieszczą się w zakresie
od zera do liczby bajtów dodatkowej pamięci okna, pomniejszonej o wielkość liczby całkowitej Long (w systemie 32-bitowym)
lub LongPtr (w systemie 64-bitowym).
Aby pobrać niektóre właściwości okna, możemy także podać jedną z poniższych wartości:
Wartość Opis Const GWL_WNDPROC = (-4) zwraca adres procedury okna Const GWL_HINSTANCE = (-6) zwraca uchwyt do instancji programu Const GWL_HWNDPARENT = (-8) zwraca uchwyt do okna rodzica Const GWL_ID = (-12) zwraca identyfikator okna potomnego Const GWL_STYLE = (-16) zwraca styl okna Const GWL_EXSTYLE = (-20) zwraca rozszerzony styl okna Const GWL_USERDATA = (-21) zwraca dane użytkownika powiązane z oknem
- zwraca:
-
Przy powodzeniu, zwraca wartość zawierającą żądane informacje o oknie. Przy niepowodzeniu funkcja zwraca 0. Aby uzyskać rozszerzoną informację o zaistniałym błędzie, należy wywołać funkcję GetLastError.
Użycie funkcji GetWindowsLong(...)
Deklaracja jest trochę skomplikowana, gdyż musimy uwzględnić wersję MS Access w jakim będzie uruchamiana funkcja GetWindowsLong(...). Czy MS Access jest 64-bitowy, czy VBA jest w wersji VBA 7 (Access 2010+), czy też jest to VBA 6 (Access 2007-).
#If Win64 Then Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" _ Alias "GetWindowLongPtrA" _ (ByVal hwnd As LongPtr, _ ByVal nIndex As Long) As LongPtr #ElseIf VBA7 Then Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" _ Alias "GetWindowLongA" _ (ByVal hwnd As LongPtr, _ ByVal nIndex As Long) As LongPtr #Else Private Declare Function GetWindowLong Lib "user32" _ Alias "GetWindowLongA" _ (ByVal hwnd As Long, _ ByVal nIndex As Long) As Long #End If
-
Najczęściej funkcji GetWindowsLong(...) używa się do uzyskania stylu okna o uchwycie hwnd.
Wywołanie jest bardzo proste:
lStyle = GetWindowLong(hWind, GWL_STYLE)
Przy powodzeniu, zwracana wartość lStyle zawiera informacje o stylu okna. Należy tylko z tej zwróconej wartości wyodrębnić elementy stylu okna. O tym jak uzyskać opisowa wartości elementów stylu okna ze zwracanej wartości opisane jest na stronie Styl okna. -
Funkcji GetWindowsLong(...) można użyć zamiast funkcji GetParent(...) by uzyskać uchwyt okna będącego rodzicem okna hWind
hParent = GetWindowLong(hWind, GWL_HWNDPARENT)
-
Funkcji GetWindowsLong(...) można także użyć by uzyskać Identyfikator okna potomnego (dziecka) o uchwycie hWind
hParent = GetWindowLong(hWind, GWL_ID)
Private Sub btnTest_Click() #If VBA7 Then Dim lStyle As LongPtr Dim hParent As LongPtr Dim lWndID As LongPtr #Else Dim lStyle As Long Dim hParent As Long Dim lWndID As Long #End If #If VBA7 Then hParent = GetWindowLongPtr(Me.hwnd, GWL_HWNDPARENT) lWndID = GetWindowLongPtr(hParent, GWL_ID) lStyle = GetWindowLongPtr(hParent, GWL_STYLE) #Else hParent = GetWindowLong(Me.hwnd, GWL_HWNDPARENT) lWndID = GetWindowLong(Me.hwnd, GWL_ID) lStyle = GetWindowLong(hParent, GWL_STYLE) #End If End Sub