Domanda

C'è un modo per specificare su quale monitor appare un'applicazione in Delphi o C ++ Builder?

Sto sviluppando un semplice programma per un cliente, che visualizza gli ordini della cucina su un monitor secondario, generato da un sistema di ospitalità. Attualmente devono trascinare manualmente la finestra sul secondo monitor dopo l'avvio.

È stato utile?

Soluzione

Salvare la posizione della finestra prima dell'arresto del programma e ripristinarli all'avvio. I display multimonitor aumentano semplicemente le dimensioni del desktop; le altre superfici del monitor hanno solo una sezione diversa dello stesso piano X / Y con la sua origine nella parte superiore sinistra del monitor principale.

Questo può essere fatto automaticamente per te da uno dei numerosi componenti .

A proposito, la variabile Screen nell'unità Form ha una proprietà chiamata MonitorCount e un'altra proprietà indicizzabile, Monitor [Index: Integer]: TMonitor. TMonitor ha proprietà che indicano a sinistra, in alto, in larghezza, in altezza ecc., Quindi tutte le informazioni di cui hai bisogno sono lì.

Altri suggerimenti

L'oggetto Schermo globale (parte di Moduli) ha il concetto di Monitor. Penso che sia stato aggiunto circa Delphi 6 o 7. Il seguente codice funzionerà:

// 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;

Puoi usare qualsiasi offset positivo da quella posizione per metterlo ovunque in quel monitor. Da qui puoi anche ottenere la larghezza e l'altezza per conoscere le dimensioni.

In realtà non è la risposta alla tua domanda, ma non è possibile memorizzare le impostazioni della finestra (dimensioni, posizione, stato ingrandito) quando l'applicazione viene chiusa e quindi applicarle all'avvio?

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;

Ho fatto una cosa simile qualche tempo fa in 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 ti permetterà di specificare le coordinate di una finestra nella chiamata API CreateWindow. Non so abbastanza su Delphi o C ++ Builder per sapere se hai accesso a quella parte del processo.

Potresti anche essere in grado di spostare la finestra in un gestore WM_CREATE.

EnumDisplayMonitors ti fornirà le coordinate di ciascun monitor nel sistema.


Evidentemente Delphi e C ++ Builder hanno strutture che rendono questa risposta in qualche modo irrilevante. Lascerò qui nel caso qualcuno dovesse imbattersi in questa domanda ma abbia bisogno di una risposta per un ambiente diverso

Non faccio molto con i sistemi Windows, quindi suggerirei un hack come questo.

Prendi la larghezza del desktop visualizzabile (entrambi i monitor combinati), dividi la metà e rendi la tua posizione iniziale.

Puoi anche esaminare ciò che API ti dice sulle dimensioni di monitor2.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top