vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2020
 
zurück
Rubrik: Controls · Sonstiges   |   VB-Versionen: VB4, VB5, VB608.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 HasseBewertung:     [ Jetzt bewerten ]Views:  27.232 
www.mspsoftware.deSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 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
 

Dieser Tipp wurde bereits 27.232 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2020 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel