W poprzednim artykule • Funkcje API - jak pobrać nazwę klasy okna o uchwycie hwnd • dowiedzieliśmy się jak wykorzystać interfejs API, aby odczytać nazwę klasy okna. Po uruchomieniu przykładowego kodu wiemy, że nazwa klasy głównego okna MS Access brzmi OMain, a okno formularza jest klasy OForm.
Czasami w trakcie działania aplikacji MS Access potrzebujemy sprawdzić, czy otwarta jest inna baza MS Access,
a jeżeli tak, to ile instancji MS Access jest uruchomionych. Do tego celu wykorzystamy interfejs Windows API i jego dwie funkcje:
• GetDesktopWindow
- zwracającą uchwyt pulpitu czyli okna obejmującego cały ekran. Na pulpicie osadzone są wszystkie pozostałe okna
• FindWindowEx
- zwracającą uchwyt okna potomnego, którego albo nazwa klasy, lub (i) tytuł odpowiadają nazwom przekazanym w argumentach funkcji.
Option Compare Database Option Explicit ' • Function CountAccessInstances( _ ' Optional ByVal sAccessTitle As String = vbNullString) As Long ' -------------------------------------------------------------------------------- ' autor: Zbigniew Bratko - 02.2016 ' [sAccessTitle] - argument opcjonalny, tytuł szukanego okna, ' dla ciągu zerowej długości lub znaku vbNullString ' wyliczane są wszystkie okna MS Access, ' [Out] - zwraca liczbę uruchomionych instancji MS Access, ' o tytule odpowiadającym argumentowi sAccessTitle ' Przy niepowodzeniu zwraca 0 (Zero) ' #If VBA7 Then Private Declare PtrSafe Function FindWindowEx Lib "user32" _ Alias "FindWindowExA" _ (ByVal hWnd1 As LongPtr, _ ByVal hWnd2 As LongPtr, _ ByVal lpsz1 As String, _ ByVal lpsz2 As String) As LongPtr #Else Private Declare Function FindWindowEx Lib "user32" _ Alias "FindWindowExA" _ (ByVal hWnd1 As Long, _ ByVal hWnd2 As Long, _ ByVal lpsz1 As String, _ ByVal lpsz2 As String) As Long #End If ' Funkcja własna CountAccessInstances Public Function CountAccessInstances( _ Optional ByVal sAccessTitle As String = vbNullString) As Long #If VBA7 Then Dim hNext As LongPtr #Else Dim hNext As Long #End If ' licznik Dim lCount As Long ' nazwa klasy okna MS Access Const cAccWindowClass As String = "OMain" ' konwertuj ciąg zerowej długości "" na vbNullString, ' gdyż ciąg zerowej długości "", to nie to samo co vbNullString If Len(sAccessTitle) = 0 Then sAccessTitle = vbNullString ' szukaj pierwszego wystąpienia potomnego okna MS Access klasy "OMain" ' i tytule sDbTitle, w oknie rodzica "Pulpit" (domyślnie dla argumentu hWnd1 = 0) hNext = FindWindowEx(0, 0, ByVal cAccWindowClass, ByVal sAccessTitle) Do Until hNext = 0 ' zwiększ licznik lCount = lCount + 1 ' szukaj następnego wystąpienia okna MS Access klasy "OMain" hNext = FindWindowEx(0, ByVal hNext, ByVal cAccWindowClass, ByVal sAccessTitle) Loop CountAccessInstances = lCount End Function ' przykładowe wywołanie Private Sub btnTest_Click() Dim lRet As Long lRet = CountAccessInstances() MsgBox "Uruchomionych instancji MS Access: " & CStr(lRet) & " egz." End Sub
Brak komentarzy:
Prześlij komentarz