¿Iniciar programa en un segundo monitor?
-
03-07-2019 - |
Pregunta
¿Hay alguna manera de especificar en qué monitor aparece una aplicación en Delphi o C ++ Builder?
Estoy desarrollando un programa simple para un cliente, que muestra los pedidos de cocina en un monitor secundario, generado por un sistema de hospitalidad. Actualmente deben arrastrar la ventana manualmente al segundo monitor después de que se inicie.
Solución
Guarde la posición de la ventana antes del cierre del programa y restáurelos al inicio. Las pantallas multimonitor solo aumentan el tamaño del escritorio; otras superficies del monitor solo tienen una sección diferente del mismo plano X / Y con su origen en la parte superior izquierda del monitor principal.
Esto se puede hacer automáticamente por usted mediante cualquiera de los varios componentes .
Por cierto, la variable Screen en la unidad de Formularios tiene una propiedad llamada MonitorCount y otra propiedad indexable, Monitors [Index: Integer]: TMonitor. TMonitor tiene propiedades que indican la izquierda, la parte superior, el ancho, la altura, etc., por lo que toda la información que necesita está allí.
Otros consejos
El objeto Pantalla global (parte de Formularios) tiene el concepto de Monitores. Creo que esto se agregó alrededor de Delphi 6 o 7. El siguiente código funcionará:
// Put the form in the upper left corner of the 2nd monitor
// if more then one monitor is present.
if Screen.MonitorCount > 1 then
begin
Left := Screen.Monitors[1].Left;
Top := Screen.Monitors[1].Top;
end;
Puede usar cualquier desplazamiento positivo desde esa posición para colocarlo en cualquier lugar de ese monitor. También puede obtener el ancho y la altura desde allí para conocer las dimensiones.
No es realmente la respuesta que implica su pregunta, pero ¿no podría almacenar la configuración de la ventana (tamaño, posición, estado maximizado) cuando la aplicación está cerrada y luego aplicarla al inicio?
procedure TMDIChild.btnShowMonClick(Sender: TObject);
begin
if Screen.MonitorCount > 1 then
begin
FormShow.Left:=Screen.Monitors[1].Left;
FormShow.Top:=Screen.Monitors[1].Top;
FormShow.Width:=Screen.Monitors[1].Width;
FormShow.Height:=Screen.Monitors[1].Height;
end
else
begin
FormShow.Show;
end;
end;
Hace un tiempo que hice algo similar en Delphi 5:
procedure TForm18.FormCreate(Sender: TObject);
var
Mon: TMonitor;
MonitorIdx: Integer;
begin
MonitorIdx := 1; // better read from configuration
if (MonitorIdx <> Monitor.MonitorNum) and (MonitorIdx < Screen.MonitorCount) then begin
Mon := Screen.Monitors[MonitorIdx];
Left := Left + Mon.Left - Monitor.Left;
Top := Top + Mon.Top - Monitor.Top;
end;
end;
Windows le permitirá especificar las coordenadas de una ventana en la llamada a la API CreateWindow. No sé lo suficiente sobre Delphi o C ++ Builder para saber si tiene acceso a esa parte del proceso.
También puedes mover la ventana en un controlador WM_CREATE.
EnumDisplayMonitors le dará las coordenadas de cada monitor en el sistema.
Evidentemente, Delphi y C ++ Builder tienen instalaciones que hacen que esta respuesta sea algo irrelevante. Lo dejo aquí en caso de que alguien se encuentre con esta pregunta, pero necesita una respuesta para un entorno diferente.
No hago mucho con los sistemas de Windows, por lo que sugeriría un hack como este.
Agarre el ancho del escritorio visible (ambos monitores combinados), divídalo por la mitad y haga que sea su posición inicial.
También puedes ver lo que api te dice sobre las dimensiones de monitor2.