winapi - Fenster in C # mithilfe der Win32-API nach vorne bringen

Translate

Ich schreibe eine Anwendung, die das Fenster einer externen App in den Vordergrund stellen 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, um dies mit der win32-API zu erreichen? Ich habe SetForeground () ausprobiert, aber es stiehlt immer den Fokus und funktioniert nicht konsequent.

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

This question and all comments follow the "Attribution Required."

Alle Antworten

Mag Lee
Translate

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

Die Funktion SetForegroundWindow stellt den Thread, der das angegebene Fenster erstellt hat, in den Vordergrund und aktiviert das Fenster. Die Tastatureingabe ist auf das Fenster gerichtet

Versuchen Sie, den Fokus mit zu erfassenSetCapturevor dem Anruf. Schauen Sie sich auch verschiedene Möglichkeiten an, um das Fenster nach vorne zu bringen: SetForeGroundWindow, SetActiveWindow und sogar die Simulation eines Mausklicks können dies tun.

Quelle
Translate

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

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

Quelle
Translate

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

Quelle
Translate

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. Ansehenhttp://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx. Ich habe dies nicht in einem Fenster versucht, das zu einem anderen Prozess gehört, aber es ist wahrscheinlich einen Versuch wert.

Quelle
Translate

SetWindowPos + SWP_NOACTIVATE erledigt den Job.

Quelle
Translate

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

Quelle