Vor kurzem haben wir Ihnen gezeigt, wie man prüfen kann, ob eine bestimmte EXE-Datei bereits ausgeführt wird. Die Funktion IsEXERunning in besagtem Code gab dann entweder TRUE (EXE wird ausgeführt) oder FALSE (EXE wird nicht ausgeführt) zurück. Was aber, wenn man jetzt auch noch das Fensterhandle der EXE-Anwendung benötigt? Das zeigen wir Ihnen heute Wir erweitern die Funktion IsEXERunning um einen optionalen Parameter, der angibt, ob wir als Rückgabewert der Funktion das Fensterhandle oder vielleicht lieber die ProcessID haben möchten. Ist die EXE nicht gestartet, soll dann der Wert 0 zurückgegeben werden. ' zur Wiederholung: alle benötigten APIs Private Declare Function CreateToolhelpSnapshot Lib "Kernel32" _ Alias "CreateToolhelp32Snapshot" ( _ ByVal lFlgas As Long, _ ByVal lProcessID As Long) As Long Private Declare Function ProcessFirst Lib "Kernel32" _ Alias "Process32First" ( _ ByVal hSnapshot As Long, _ uProcess As PROCESSENTRY32) As Long Private Declare Function ProcessNext Lib "Kernel32" _ Alias "Process32Next" ( _ ByVal hSnapshot As Long, _ uProcess As PROCESSENTRY32) As Long Private Declare Sub CloseHandle Lib "Kernel32" ( _ ByVal hPass As Long) Private Const TH32CS_SNAPPROCESS As Long = 2& Private Const MAX_PATH As Long = 260 Private Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwflags As Long szexeFile As String * MAX_PATH End Type Private Enum procReturnValue Handle = 0 ProcessID = 1 End Enum Erweiterung der Funktion IsEXERunning, wie oben beschrieben: ' Prüft, ob eine EXE-Datei bereits ausgeführt wird ' und gibt im Erfolgsfall entweder das Fensterhandle ' oder die Process-ID zurück Private Function IsEXERunning(ByVal sFilename As String, _ Optional ByVal iReturn As procReturnValue = ProcessID) As Long Dim lSnapshot As Long Dim uProcess As PROCESSENTRY32 Dim nResult As Long ' "Snapshot" des aktuellen Prozess ermitteln lSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&) If lSnapshot <> 0 Then uProcess.dwSize = Len(uProcess) ' Ersten Prozess ermitteln nResult = ProcessFirst(lSnapshot, uProcess) Do Until nResult = 0 ' Prozessliste durchlaufen If InStr(LCase$(uProcess.szexeFile), LCase$(sFilename)) > 0 Then ' Jepp - EXE gefunden If iReturn = Handle Then IsEXERunning = ProcID2hWnd(uProcess.th32ProcessID) Else IsEXERunning = uProcess.th32ProcessID End If Exit Do End If ' nächster Prozess nResult = ProcessNext(lSnapshot, uProcess) Loop ' Handle schliessen CloseHandle lSnapshot End If End Function Und jetzt noch die Funktion, die zu einer ProcessID das zugehörige Fensterhandle ermittelt. ' Weitere API-Deklarationen Private Declare Function GetWindowThreadProcessId Lib "user32" ( _ ByVal hwnd As Long, _ lpdwProcessId As Long) As Long Private Declare Function FindWindow Lib "user32" _ Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare Function GetWindow Lib "user32" ( _ ByVal hwnd As Long, _ ByVal wCmd As Long) As Long Private Declare Function GetParent Lib "user32" ( _ ByVal hwnd As Long) As Long Private Const GW_HWNDNEXT = 2 ' Ermittelt das Fensterhandle anhand einer Prozess-ID Private Function ProcID2hWnd(ByVal ProcID As Long) As Long ' alle Fenster durchlaufen und nach Process-ID suchen Dim lngHWnd As Long Dim lngProcTaskID As Long lngHWnd = FindWindow(vbNullString, vbNullString) Do While lngHWnd <> 0 ' Existiert kein Eltern-Fenster, dann ProcssID ' ermitteln und mit TaskID vergleichen If GetParent(lngHWnd) = 0 Then GetWindowThreadProcessId lngHWnd, lngProcTaskID ' Handelt es sich um die gesuchte TaskID? If lngProcTaskID = ProcID Then ' Fenster-Handle zurückgeben und Schleife ' verlassen! ProcID2hWnd = lngHWnd Exit Do End If End If ' Nächstes Fenster lngHWnd = GetWindow(lngHWnd, GW_HWNDNEXT) Loop End Function Beispiel für den Aufruf: ' Prüfen, ob WinWord ausgeführt wird ' wenn ja, Fensterhandle ermitteln Dim lngHWnd As Long lngHWnd = IsEXERunning("winword.exe", Handle) If lngHWnd <> 0 Then MsgBox "WinWord-Fensterhandle: " & CStr(lngHWnd) Else MsgBox "WinWord wird nicht ausgeführt." End If Dieser Tipp wurde bereits 36.225 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevDTA 3.0 Pro SEPA mit Kontonummernprüfung Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |