c# monitor multiple-monitors

c# - ¿Iniciar una aplicación y enviarla al segundo monitor?



multiple-monitors (5)

¿Hay alguna manera de comenzar / almorzar un programa a través del Proceso en otra pantalla?

Alguien preguntó eso here pero no hubo respuesta.

Nota: ¡no es un formulario en mi aplicación, estoy preguntando por ejecutar un programa externo en otra pantalla!


Como la ventana no es tuya, solo puedes moverla invocando la API de Windows. Tendrás que hacer esto:

  • Lanza el proceso.

  • Use FindWindow para recuperar el identificador de la ventana. Si la ventana aún no existe, el proceso aún no la ha creado; duerma durante 500ms y luego intente de nuevo. (Pero no entre en un ciclo infinito, deténgalo si no puede encontrar la ventana después de un tiempo de espera razonable).

  • Use SetWindowPos para cambiar la posición de la ventana.

Si no conoce el título de la ventana, no puede usar FindWindow . En ese caso,

  • Inicie el proceso y gestione el proceso recuperando Process.Handle .

  • Use EnumWindows para recuperar todas las ventanas. Para cada ventana, use GetWindowThreadProcessId para verificar si pertenece a su proceso. Si su proceso no tiene ventana, espere y siga intentándolo.

  • Use SetWindowPos para cambiar la posición de la ventana.

Por supuesto, puede usar Screen.AllScreens[n].WorkingArea para recuperar la posición y el tamaño de la pantalla que desea, y luego puede colocar la ventana en relación con eso.


Debería iniciar el proceso, obtener la ventana principal de procesos y usar una llamada API como SetWindowPos () para mover la ventana a la pantalla que desea.


Intenta poner este código en el método form_load :

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

El valor de x debe ser mayor que el ancho de su pantalla principal. Por ejemplo, si su pantalla principal tiene una resolución de 1366 por 786 píxeles, debe dar un valor xa de al menos 1368 o superior.

Funcionó para mí Pero solo es para fines de depuración. Después de todo, tendrás que ejecutarlo en el monitor principal cuando la aplicación finalice.


Primero salga del área del segundo monitor usando algo como:

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

El uso de la API de Windows SetWindowPos para moverlo, utilizando Process.MainWindowHandle se obtiene desde el inicio del otro proceso como el controlador.


Timwi proporcionó un consejo muy útil, así que decidí crear un script de powershell llamando a una biblioteca con estas funciones para un uso más fácil y compartir la solución.

Necesitaba ejecutar varias ventanas de Chrome en el inicio, y la solución en GitHub se dirige exactamente a este problema (pregunta relacionada: https://superuser.com/a/901790/111424 ).

Pero la lógica subyacente es la misma:

  1. Encuentre el Manejador de Windows para operar. Puede usar FindWindow o EnumWindows en caso genérico como mencionó Timwi . Pero si su proceso es simple y tiene una sola ventana principal, es solo:

    var hndl = proc.MainWindowHandle

  2. Tener el mango, puede usar la siguiente función. Solo debe proporcionar el número de pantalla (comenzando desde 1) y el identificador:

    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); }

Todas las enumeraciones y las importaciones de funciones que puede encontrar en http://www.pinvoke.net/ o simplemente copie mi código en GitHub: https://github.com/alex-tomin/Tomin.Tools.KioskMode .