Rubrik: Controls · Sonstiges | VB-Versionen: VB4, VB5, VB6 | 08.12.01 |
Welches Control hat den Fokus - systemübergreifend Egal welche Anwendung gerade aktiv ist - dieser Tipp verrät Ihnen den Klassennamen, sowie das Fensterhandle des aktiven Controls! | ||
Autor: Ronny Hasse | Bewertung: | Views: 29.961 |
www.mspsoftware.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Würden Sie gerne wissen, welches Control gerade den Fokus besitzt? Kein Problem, werden Sie sich jetzt sagen - das ist doch ganz einfach:
MsgBox "Aktuelles Control: " & Me.ActiveControl.Name
Hmmm... da haben Sie sicherlich nicht ganz unrecht - funktioniert aber nur innerhalb der eigenen Anwendung. Was aber, wenn Sie die Informationen über das aktuelle Control benötigen, egal welche Anwendung gerade aktiv ist?
Dann hilft Ihnen nachfolgender Tipp!
Um das Beispiel auszuprobieren, erstellen Sie am besten ein neues Projekt und plazieren auf die Form ein Timer-Steuerelement (tmrTimer), setzen Interval=100, und ziehen noch zwei Textbox-Controls auf die Form (txtClassName und txtHandle).
Fügen Sie nachfolgende Code in den Allgemein-Teil der Form:
' alle benötigten API-Deklarationen Private Declare Function GetClassName Lib "user32" _ Alias "GetClassNameA" ( _ ByVal hWnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare Function GetFocus Lib "user32" () As Long Private Declare Function GetForegroundWindow Lib "user32" () As Long Private Declare Function GetWindowThreadProcessId Lib "user32" ( _ ByVal hWnd As Long, _ lpdwProcessId As Long) As Long Private Declare Function AttachThreadInput Lib "user32" ( _ ByVal idAttach As Long, _ ByVal idAttachTo As Long, _ ByVal fAttach As Long) As Long ' benutzerdefinierter Datentyp Private Type tActiveCtrInfo lnghWnd As Long strClassName As String End Type
Über das Timer-Ereignis des Timers wird jetzt in kurzen Zeitabständen sowohl der Klassennamen, als auch das Windowhandle des aktiven Controls ermittelt, und zwar systemübergreifend, d.h. egal, welche Anwendung gerade aktiv ist.
' Prüfung... Private Sub tmrTimer_Timer() Dim aciActCtr As tActiveCtrInfo ' Aktives Control... aciActCtr = GetActiveControl ' ...in den beiden Textboxen anzeigen With aciActCtr txtClassName.Text = .strClassName txtHandle.Text = CStr(.lnghWnd) End With End Sub
Und hier die Funktion, die das aktive Control ermittelt.
' Aktives Cntrol ermitteln Private Function GetActiveControl() As tActiveCtrInfo Dim strBuffer As String Dim lngOtherThreadID As Long Dim lngThread1 As Long Dim lngThread2 As Long Dim lngGetCurrentThreadID As Long Dim blnReminder As Boolean Dim lnghWndControl As Long ' Prozess-ID der eigenen Anwendung lngThread1 = GetWindowThreadProcessId(Me.hWnd, _ lngGetCurrentThreadID) ' Prozess-ID der aktiven Anwendung lngThread2 = GetWindowThreadProcessId(GetForegroundWindow(), _ lngOtherThreadID) ' Falls eigene Anwendung nicht die aktive Anwendung... If lngThread1 <> lngThread2 Then blnReminder = AttachThreadInput(lngThread2, _ lngThread1, True) End If ' Handle des aktuellen Controls lnghWndControl = GetFocus() GetActiveControl.lnghWnd = lnghWndControl If blnReminder Then blnReminder = AttachThreadInput(lngThread2, _ lngThread1, False) End If ' jetzt Klassennamen ermitteln strBuffer = Space(255) GetClassName lnghWndControl, strBuffer, Len(strBuffer) If InStr(strBuffer, Chr$(0)) > 0 Then strBuffer = Left$(strBuffer, _ InStr(strBuffer, Chr$(0)) - 1) End If GetActiveControl.strClassName = strBuffer End Function
Tipp:
Setzen Sie das Fenster des Beispielsprojekts während der Laufzeit in den Vordergrund, so dass dieses nicht von den anderen Anwendungen überdeckt werden kann. Siehe hierzu: Fenster immer im Vordergrund anzeigen