Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0247: Welches Objekt anderer Anwendungen hat den Focus

 von 

Beschreibung 

Welches Objekt auf dem eigenen Formular den Focus hat, läßt sich mit GetFocus() recht leicht herausfinden. Doch wie siehts aus bei Fremdfenstern? Hier hilft die Function AttachThreadInput.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

AttachThreadInput, GetClassNameA (GetClassName), GetFocus, GetForegroundWindow, GetWindowThreadProcessId, SendMessageA (SendMessage), SetWindowPos

Download:

Download des Beispielprojektes [2,57 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias form1.frm  ---------
' Steuerelement: Textfeld "Text2"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Timersteuerelement "Timer1"
' Steuerelement: Textfeld "Text1"
' Steuerelement: Beschriftungsfeld "Label2"
' Steuerelement: Beschriftungsfeld "Label1"


'Dank an Olaf Quasdorff (oquasdorff@web.de)
' 03.08.2000

Option Explicit

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 SendMessage Lib "user32" Alias _
        "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal _
        wParam As Integer, ByVal lParam As Any) As Long
    
Private Declare Function AttachThreadInput Lib "user32" (ByVal _
        idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach _
        As Long) As Long
                    
Private Declare Function SetWindowPos Lib "user32" (ByVal _
        hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x _
        As Long, ByVal y As Long, ByVal cx As Long, ByVal _
        cy As Long, ByVal wFlags As Long) As Long
                   

Const HWND_TOPMOST As Long = -1&
Const SWP_NOSIZE As Long = &H1&
Const SWP_NOMOVE As Long = &H2&

Dim nHWndControl As Long

Private Sub Form_Load()
    Call SetWindowPos(Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
End Sub

Private Sub Command1_Click()
    Unload Me
End Sub

Private Sub Timer1_Timer()
    Call GetControl
End Sub

Private Sub GetControl()
    Dim Buffer As String
    Dim Result As Long, GetCurrentThreadID As Long
    Dim OtherThreadID As Long, Thread1 As Long, Thread2 As Long
    Dim bMerker As Boolean
          
    Thread1 = GetWindowThreadProcessId(Me.hwnd, GetCurrentThreadID)
    Thread2 = GetWindowThreadProcessId(GetForegroundWindow, OtherThreadID)
         
    If Thread1 <> Thread2 Then bMerker = AttachThreadInput(Thread2, _
                                         Thread1, True)
    
    Result = GetFocus()
    nHWndControl = Result
    Text1.Text = Result
    
    If bMerker Then bMerker = AttachThreadInput(Thread2, Thread1, False)
    
    Buffer$ = Space(255)
    Call GetClassName(nHWndControl, Buffer, Len(Buffer))
    Text2.Text = Buffer
End Sub
'---------- Ende Formular "Form1" alias form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 4 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Andreas am 09.12.2008 um 08:55

Tolle Sache.
Leider zerstört der API-Aufruf 'AttachThreadInput' sämtliche events des jeweiligen Controls.
z.B: DoubleClick, DropDown, ...

Gibt es für dieses Zerstören der Events keine Lösung?

Gruß
Andreas

Kommentar von marc wäsche am 22.04.2004 um 19:21

Super! Genau sowas habe ich gesucht und es klappt bestens. :-)

Viele Grüße,
Marc

Kommentar von Nicolai am 13.07.2003 um 21:37

Gibt es da keine sauberere Lösung?

Kommentar von am 04.12.2002 um 14:34

Mir fällt auf, dass immer wenn in kurzen abständen (hier: 100ms) irgendwas mit ner api-Funktion gemacht wird, der Doppelkick nemme geht!