Discussion:
blinkende Forml äßt kein SetFocus zu
(zu alt für eine Antwort)
Wendelin Uez
2024-12-03 19:59:56 UTC
Permalink
Mein P1.exe schickt an ein laufendes P2.exe per SendMessage eine Nachricht,
woraufhin P2 ein Fenster mit mehreren Eingabefeldern öffnet. Leider blinkt
das neue Fenster nur ein paarmal herum, aber ich kann den Focus nicht in das
gewünschte Eingabefeld platzieren und muß das jedesmal von Hand machen.

Ich habe daraufhin eine Timerkonstruktion eingebaut, daß P2 nicht das
Fenster direkt öffnet, sondern nur ein Flag setzt, und erst der Timerevent
wertet später das Flag aus und öffnet das Fenster. Aber auch hier bringt ein
SetFocus nichts, das Fenster blinkt immer noch.

Das Fenster blinkt, egal es bereits angezeigt oder erst noch geladen wird.

Öffnet P2 das Fenster ohne Anstoß von aussen, dann funktioniert alles
wunderbar.

Wie kriege ich es hin, daß ich den Focus in das gewünschte Eingabefeld
(simple Textbox) setzen kann? Welcher Windows-Mechanismus steckt da
dahinter?
Klaus Ketelaer
2024-12-04 08:46:18 UTC
Permalink
Post by Wendelin Uez
Mein P1.exe schickt an ein laufendes P2.exe per SendMessage eine
Nachricht, woraufhin P2 ein Fenster mit mehreren Eingabefeldern öffnet.
Leider blinkt das neue Fenster nur ein paarmal herum, aber ich kann den
Focus nicht in das gewünschte Eingabefeld platzieren und muß das
jedesmal von Hand machen.
Ich habe daraufhin eine Timerkonstruktion eingebaut, daß P2 nicht das
Fenster direkt öffnet, sondern nur ein Flag setzt, und erst der
Timerevent wertet später das Flag aus und öffnet das Fenster. Aber auch
hier bringt ein SetFocus nichts, das Fenster blinkt immer noch.
Das Fenster blinkt, egal es bereits angezeigt oder erst noch geladen wird.
Öffnet P2 das Fenster ohne Anstoß von aussen, dann funktioniert alles
wunderbar.
Wie kriege ich es hin, daß ich den Focus in das gewünschte Eingabefeld
(simple Textbox)  setzen kann? Welcher Windows-Mechanismus steckt da
dahinter?
Keine Ahnung.

Ich würde auf jeden Fall sicherstellen, dass das Fenster
auch korrekt im Vordergrund ist.

Das widerrum mache ich (unter Windows 7) so:

Sub MoveToForeground(ByVal hwnd As Long)
Dim idThreadForeground As Long
Dim idThreadMe As Long

If hwnd <> GetForegroundWindow Then
idThreadForeground = GetWindowThreadProcessId(GetForegroundWindow, 0)
idThreadMe = GetWindowThreadProcessId(hwnd, 0)

If idThreadForeground <> idThreadMe Then
AttachThreadInput idThreadForeground, idThreadMe, True
SetForegroundWindow hwnd
BringWindowToTop hwnd
AttachThreadInput idThreadForeground, idThreadMe, False
Else
SetForegroundWindow hwnd
BringWindowToTop hwnd
End If
End If
End Sub

Loading...