2010-09-20 12 views
20

¿Hay alguna forma de iniciar/almorzar un programa a través del proceso en otra pantalla?¿Iniciar una aplicación y enviarla al segundo monitor?

Alguien preguntó here pero no hubo respuesta.

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

+0

posible duplicado de [Inicie una aplicación y envíela al segundo monitor] (http://stackoverflow.com/questions/797154/launch-an-application-and-send-it-to-second-monitor) –

+2

Es no es un duplicado, es ligeramente diferente, el otro post trata de la aplicación inmediata, quiere mover una ventana de aplicación externa. – Lloyd

Respuesta

23

Como la ventana no es suya, solo puede moverla invocando la API de Windows. Tendrá que hacer esto:

  • Inicie el proceso.

  • Use FindWindow para recuperar el asa 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 entramos en un bucle infinito; detendrá si no puede encontrar la ventana después de un tiempo de espera razonable.)

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

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

  • lanzar el proceso y obtener el identificador de proceso mediante la recuperación de Process.Handle.

  • Utilice 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.

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

Por supuesto, puede utilizar Screen.AllScreens[n].WorkingArea para recuperar la posición y el tamaño de la pantalla que desee y, a continuación, puede colocar la ventana en relación a eso.

2

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.

9

Primera salir 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 el Process.MainWindowHandle que obtuvo de la partida de otro proceso como el mango.

3

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

que necesitaba para ejecutar múltiples ventanas de Chrome en el arranque, y la solución de los objetivos de GitHub exactamente este problema (pregunta relacionada: https://superuser.com/a/901790/111424).

Pero la lógica subyacente es el mismo:

  1. Encuentra Mango de Windows para operar. Puede utilizar FindWindow o EnumWindows en caso genérico como Timwi mencionado. Pero si el proceso es sencillo y tiene una sola ventana principal, es simplemente:

    var hndl = proc.MainWindowHandle 
    
  2. Tener el mango, puede utilizar la siguiente función. Sólo tiene que proporcionar el número de la pantalla (a partir de 1) y el asa:

    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 función que pueden encontrar en http://www.pinvoke.net/ o simplemente copiar el código en GitHub: https://github.com/alex-tomin/Tomin.Tools.KioskMode.

0

tratar de 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 la pantalla principal. Por ejemplo, si su pantalla principal tiene una resolución de 1366 por 786 píxeles, debe dar x un valor de al menos 1368 o superior.

Me funcionó. 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.

Cuestiones relacionadas