Wie oft kennt man das Handle eines Fenster, weiss aber nicht, zu welcher Anwendung das Fenster gehört. Mit unserem nachfolgendem Tipp stellen wir Ihnen genau für dieses Problem eine entsprechende Lösung vor. Die Funktion GetEXEFromHWND ermittelt den Dateinamen der Anwendung eines übergebenen Fensterhandles. Hierzu bedarf allerlei API-Deklarationen - aber sehen Sie selbst. Fügen Sie nachfolgenden Code in ein neues Modul ein: Option Explicit ' alle benötigten API-Deklarationen Private Declare Function GetWindowThreadProcessId Lib "user32" ( _ ByVal hWnd As Long, _ lpdwProcessId As Long) As Long 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 ' Ermittelt den Namen der EXE-Datei eines Fenster ' anhand des übergebenen Fensterhandles (hWnd) Public Function GetExeFromHWND(hWnd As Long) As String Dim lThreadID As Long Dim lProcessID As Long Dim lSnapshot As Long Dim uProcess As PROCESSENTRY32 Dim lProcessFound As Long Dim i As Integer Dim sEXEName As String ' Prozess-ID ermitteln lThreadID = GetWindowThreadProcessId(hWnd, lProcessID) ' Prüfen, ob ID's gültig If lThreadID <> 0 And lProcessID <> 0 Then ' "Snapshot" des aktuellen Prozess ermitteln lSnapshot = CreateToolhelpSnapshot( _ TH32CS_SNAPPROCESS, 0&) ' Fehler? If lSnapshot = -1 Then Exit Function ' uProcess-Struktur füllen With uProcess .dwSize = Len(uProcess) ' alle aktuellen Prozesse durchlaufen lProcessFound = ProcessFirst(lSnapshot, uProcess) Do While lProcessFound If .th32ProcessID = lProcessID Then ' ProzessID gefunden ' jetzt EXE-Name ermitteln If InStr(.szexeFile, Chr$(0)) > 0 Then sEXEName = Left$(.szexeFile, _ InStr(.szexeFile, Chr$(0)) - 1) End If Exit Do Else ' ...weitersuchen... lProcessFound = ProcessNext(lSnapshot, _ uProcess) End If Loop End With ' Handle schliessen Call CloseHandle(lSnapshot) End If GetExeFromHWND = sEXEName End Function Erstellen Sie eine Form und plazieren Sie darauf einen CommandButton. Beim Klicken wird dann der EXEName der aktuellen Anwendung ermittelt: Private Sub Command1_Click() MsgBox GetExeFromHWND(Me.hWnd) End Sub Wenn Sie das Beispiel innerhalb der VB-IDE ausprobieren, sollte als EXEName VB6.EXE angezeigt werden (bzw. VB5.EXE unter Visual Basic 5). Kompilieren Sie Ihre Anwendung hingegen und starten dann die kompilierte EXE-Datei, so erscheint nicht mehr VB6.EXE, sondern vielmehr der EXEName Ihrer Anwendung. Erweitertes Beispiel Fügen Sie hierzu folgenden Code in den Code-Teil der Form ein: Option Explicit ' zunächst die benötigten API-Deklarationen Private Type POINTAPI x As Long y As Long End Type Private Declare Function GetCursorPos Lib "user32" ( _ lpPoint As POINTAPI) As Long Private Declare Function WindowFromPoint Lib "user32" ( _ ByVal xPoint As Long, _ ByVal yPoint As Long) As Long Private Sub Form_Load() ' Timer initialisieren tmrTimer.Interval = 10 End Sub Private Sub tmrTimer_Timer() Dim oPoint As POINTAPI Dim hWnd As Long ' Mausposition ermitteln If GetCursorPos(oPoint) <> 0 Then ' Fensterhandle des Controls, auf dem sich ' der Mauszeiger befindet hWnd = WindowFromPoint(oPoint.x, oPoint.y) ' Handle anzeigen lblHandle.Caption = hWnd ' EXE-Name lblEXEName.Caption = GetExeFromHWND(hWnd) End If End Sub Dieser Tipp wurde bereits 23.194 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. |
sevGraph (VB/VBA) Grafische Auswertungen Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! 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. |