W poprzednim artykule • Funkcje API - jak pobrać tytuł (tekst) okna o uchwycie hwnd • dowiedzieliśmy się jak wykorzystać interfejs API, aby odczytać tytuł (tekst) okna. Czasami w trakcie działania aplikacji MS Access potrzebujemy sprawdzić nie tylko jaki tytuł (tekst) ma okno, ale także nazwę klasy okna w systemie Windows.
Klasa okna jest to struktura opisująca podstawowe cechy okna: kolor tła, szerokość obramowania, menu sterowania, przyciski minimalizuj, maksymalizuj, zamknij, ikona paska tytułowego, paski przewijania, przypisany do okna kursor myszy i wiele innych cech okna.
• Odczyt nazwy klasy okna o uchwycie hwnd.
MS Access nie posiada żadnych metod i właściwości pozwalających na odczytanie nazwy klasy okna.
Aby pobrać nazwę klasy okna musimy skorzystać z interfejsu API i jednej z jego funkcji:
• GetClassName
- zwracającą długość pobranej do buforu nazwy klasy okna, a w buforze nazwę klasy okna
o uchwycie hwnd.
Option Compare Database Option Explicit ' • Function GetWinClassName(hWind As Long;[LongLong];[LngPtr]) As String ' -------------------------------------------------------------- ' autor: Zbigniew Bratko - 01.2016 ' [hWind] - uchwyt okna, którego nazwa klasy będzie pobierana ' w środowisku 32 bitowym liczba typu Long ' w środowisku 64 bitowym liczba typy LongLong ' w środowisku VBA7 może być typu LongPtr ' [Out] - zwraca nazwę klasy okna ' Przy niepowodzeniu zwraca ciąg zerowej długości "" ' #If VBA7 Then Private Declare PtrSafe Function GetClassName Lib "user32" _ Alias "GetClassNameA" _ (ByVal hwnd As LongPtr, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long #Else Private Declare Function GetClassName Lib "user32" _ Alias "GetClassNameA" _ (ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long #End If ' Funkcja własna GetWinClassName #If VBA7 Then ' Deklaracja funkcji - zarówno w 32 jak i 64 bitowym środowisku VBA 7 Public Function GetWinClassName(hWind As LongPtr) As String #Else ' Deklaracja funkcji - tylko 32 bitowe środowisko VBA 6 Public Function GetWinClassName(hWind As Long) As String #End If Dim sBuffer As String Dim lLenText As Long Const cMaxSizeBuffer As Long = 256 ' przygotuj bufor na przyjęcie tekstu sBuffer = String(cMaxSizeBuffer, vbNullChar) ' pobierz długość zwróconego tekstu lLenText = GetClassName(hWind, sBuffer, cMaxSizeBuffer) ' utnij nadmiarowy ciąg znaków vbNullChar w buforze GetWinClassName = Left$(sBuffer, lLenText) End Function ' przykładowe wywołanie: Private Sub btnTest_Click() ' pobierz nazwę klasu okna formularza i okna aplikacji MS Access MsgBox "Nazwa klasy okna formularza: " & _ GetWinClassName(Me.hwnd) & vbNewLine & _ "Nazwa klasy okna MS Access: " & _ GetWinClassName(Application.hWndAccessApp) End Sub
Po uruchomieniu przykładowego wywołania, MS Access wyświetla okno komunikatu:
• OMain - jest to nazwa klasy okna MS Access.
• OForm - jest to nazwa klasy okna formularza.
Obie te nazwy klas okien warto zapamiętać, gdyż przydadzą się na następnych stronach, na których będziemy korzystali
z funkcji API, by odwoływać się do okien MS Access.
Brak komentarzy:
Prześlij komentarz