Frage

Ich schreibe eine Anwendung, die das Fenster einer externen App in den Vordergrund bringen und nicht unbedingt den Fokus stehlen muss (es gibt eine Einstellung, die der Benutzer umschalten kann, um den Fokus zu stehlen/nicht zu stehlen).

Was ist der beste Weg, dies mit der Win32-API zu erreichen?Ich habe SetForeground() ausprobiert, aber es stiehlt immer den Fokus und funktioniert nicht durchgehend.

Was ist der beste Weg, dies zu erreichen?Irgendwelche Gedanken?

War es hilfreich?

Lösung

SetForegroundWindow soll den Fokus stehlen und es gibt bestimmte Fälle, in denen dies fehlschlägt.

Die SetForegroundWindow-Funktion stellt den Thread, der das angegebene Fenster erstellt hat, in den Vordergrund und aktiviert das Fenster.Tastatureingaben werden an das Fenster weitergeleitet

Versuchen Sie, den Fokus mit einzufangen SetCapture bevor Sie den Anruf tätigen.Schauen Sie sich auch verschiedene Möglichkeiten an, das Fenster nach vorne zu bringen:SetForeGroundWindow, SetActiveWindow und sogar die Simulation eines Mausklicks können dies tun.

Andere Tipps

Was ist der Unterschied zwischen SetForeGroundWindow, SetActiveWindow und BringWindowToTop?Es scheint, als ob sie alle das Gleiche tun.

Laut MSDN aktiviert SetForeGroundWindow das Fenster und lenkt den Tastaturfokus darauf.Dies versucht auch dann zu funktionieren, wenn Ihr Prozess im Hintergrund läuft.SetActiveWindow macht dasselbe wie SetForeGroundWindow, macht aber nichts, wenn Ihre Anwendung nicht die vorderste Anwendung ist.Schließlich bringt BringWindowToTop nur das Fenster nach oben und ändert nicht den Tastaturfokus.

Sie können die BringWindowToTop-Funktion ausprobieren, um den Fokus nicht zu stehlen.Ich habe es nicht verwendet, aber es scheint das zu sein, wonach Sie suchen.

Haben Sie versucht, SetWindowPos zu verwenden?Dies ist die kanonische Funktion zum Verschieben, Ändern der Größe und Festlegen der Z-Reihenfolge in Windows.Es gibt ein SWP_NOACTIVATE-Flag, das Sie verwenden können.Ansehen http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx.Ich habe dies noch nicht in einem Fenster versucht, das zu einem anderen Prozess gehört, aber es ist wahrscheinlich einen Versuch wert.

SetWindowPos + SWP_NOACTIVATE erledigt den Job.

Sie können FindWindow verwenden, um den HWND des Fensters abzurufen, und dann die Funktion BringWindowToTop in der Win32-API verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top