it-swarm.com.de

Eine Anwendung starten und an den zweiten Monitor senden?

Gibt es eine Möglichkeit, ein Programm über Process in einem anderen Bildschirm zu starten/zu Mittag zu essen?

Jemand fragte das hier , aber es gab keine Antwort.

Hinweis: Es ist kein Formular in meiner App. Ich möchte ein externes Programm auf einem anderen Bildschirm ausführen.

22
Data-Base

Da das Fenster nicht Ihnen gehört, können Sie es nur durch Aufrufen der Windows-API verschieben. Sie müssen das tun:

  • Starten Sie den Vorgang.

  • Verwenden Sie FindWindow , um das Handle des Fensters abzurufen. Wenn das Fenster noch nicht vorhanden ist, wurde es noch nicht erstellt. Schlafen Sie 500ms und versuchen Sie es erneut. (Gehen Sie aber nicht in eine Endlosschleife; halten Sie an, wenn Sie das Fenster nach einer angemessenen Zeit nicht finden können.)

  • Verwenden Sie SetWindowPos , um die Position des Fensters zu ändern.

Wenn Sie den Titel des Fensters nicht kennen, können Sie FindWindow nicht verwenden. In diesem Fall,

  • Starten Sie den Prozess und rufen Sie den Prozess-Handle ab, indem Sie Process.Handle abrufen.

  • Verwenden Sie EnumWindows , um alle Fenster abzurufen. Verwenden Sie für jedes Fenster GetWindowThreadProcessId , um zu prüfen, ob es zu Ihrem Prozess gehört. Wenn kein Fenster zu Ihrem Prozess gehört, warten Sie und versuchen Sie es erneut.

  • Verwenden Sie SetWindowPos , um die Position des Fensters zu ändern.

Natürlich können Sie Screen.AllScreens[n].WorkingArea verwenden, um die gewünschte Position und Größe des Bildschirms abzurufen. Anschließend können Sie das Fenster relativ dazu positionieren.

24
Timwi

Gehen Sie zuerst aus dem Bereich des zweiten Monitors heraus, indem Sie Folgendes verwenden:

Rectangle area = Screen.AllScreens[1].WorkingArea;

Sie können die Windows-API SetWindowPos verwenden, um sie mithilfe der Process.MainWindowHandle zu verschieben, die Sie vom Start des anderen Prozesses als Handle erhalten haben.

10
Hans Olsson

Timwi gab einen sehr nützlichen Tipp. Daher entschied ich mich, ein Powershell-Skript zu erstellen, das eine Bibliothek mit diesen Funktionen aufruft, um die Verwendung zu erleichtern, und die Lösung gemeinsam zu nutzen.

Ich musste beim Start mehrere Chrome-Fenster ausführen, und die Lösung von GitHub zielt genau auf dieses Problem ab (verwandte Frage: https://superuser.com/a/901790/111424 ).

Die zugrunde liegende Logik ist jedoch dieselbe: 

  1. Finden Sie den Windows Handle, mit dem Sie arbeiten können Sie können FindWindow oder EnumWindows im generischen Fall als Timwi verwenden. Wenn Ihr Prozess jedoch einfach ist und ein einziges Hauptfenster hat, dann ist dies einfach: 

    var hndl = proc.MainWindowHandle
    
  2. Mit dem Handle können Sie die folgende Funktion verwenden. Sie müssen lediglich die Display-Nummer (ab 1) und das Handle angeben:

    public static bool MoveToMonitor(IntPtr windowHandle, int monitor)
    {
        monitor = monitor - 1;
        return WinApi.SetWindowPos(windowHandle, IntPtr.Zero, Screen.AllScreens[monitor].WorkingArea.Left,
            Screen.AllScreens[monitor].WorkingArea.Top, 1000, 800, SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOREDRAW);
    }
    

Alle Enumerationen und Funktionsimporte, die Sie auf http://www.pinvoke.net/ finden, oder einfach meinen Code auf GitHub kopieren: https://github.com/alex-tomin/Tomin. Tools.KioskMode .

4
Oleksandr

Sie müssen den Prozess starten, das Hauptfenster der Prozesse aufrufen und einen API-Aufruf wie SetWindowPos () verwenden, um das Fenster auf den gewünschten Bildschirm zu verschieben.

2
Lloyd

Versuchen Sie, diesen Code in die form_load-Methode einzufügen:

this.setdesktoplocation(int x, int y);
this.windowstate = formwindowstate.maximized;

Der Wert von x muss größer sein als die Breite Ihres Hauptbildschirms. Wenn Ihr Hauptbildschirm beispielsweise eine Auflösung von 1366 x 786 Pixeln hat, sollten Sie x einen Wert von mindestens 1368 oder darüber geben. 

Es hat für mich funktioniert. Es dient jedoch nur zur Fehlersuche. Sie müssen es schließlich auf dem Hauptmonitor ausführen, wenn die App fertig ist.

0
Abel Jan Asa