VB 5/6-Tipp 0247: Welches Objekt anderer Anwendungen hat den Focus
von Olaf Quasdorff
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: | Verwendete API-Aufrufe: AttachThreadInput, GetClassNameA (GetClassName), GetFocus, GetForegroundWindow, GetWindowThreadProcessId, SendMessageA (SendMessage), SetWindowPos | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB5 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB6 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
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!