Pergunta

Existe uma maneira de especificar quais monitorar um aparece aplicativo em em Delphi ou C ++ Builder?

Estou desenvolvendo um programa simples para um cliente, que exibe ordens de cozinha em um monitor secundário, gerado por um sistema de hospitalidade. Atualmente eles precisam arrastar manualmente a janela para o segundo monitor depois de iniciado.

Foi útil?

Solução

Salvar a posição da janela antes do desligamento do programa e restaurá-los na inicialização. Multimonitor exibe apenas aumentar o tamanho da área de trabalho; outro monitor superfícies apenas tem uma secção diferente do mesmo plano X / Y com a sua origem na parte superior esquerda do monitor principal.

Isso pode ser feito automaticamente para você por qualquer um dos vários componentes .

BTW, a variável de tela na unidade Forms tem uma propriedade chamada MonitorCount e outra propriedade indexável, Monitores [Index: Integer]: TMonitor. TMonitor tem propriedades que indicam a esquerda, superior, largura, altura, etc, por isso toda a informação que você precisa está lá.

Outras dicas

O objeto Screen global (parte Forms) tem o conceito de Monitores. Eu acho que isso foi adicionado cerca de Delphi 6 ou 7. O código a seguir irá 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;

Você pode usar qualquer deslocamento positivo a partir dessa posição para colocá-lo em qualquer lugar que monitor. Você pode obter a largura e altura de lá também para saber as dimensões.

Não é realmente a resposta a sua pergunta implica, mas você não pode armazenar as configurações da janela (tamanho, posição, estado maximizado) sempre que o aplicativo for fechado, e depois aplicá-los na inicialização?

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;

Eu fiz uma coisa semelhante há um tempo atrás em 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 permitirá que você especificar as coordenadas de uma janela na chamada API CreateWindow. Eu não sei o suficiente sobre Delphi ou C ++ Builder para saber se você tem acesso a essa parte do processo.

Você também pode ser capaz de mover a janela em um manipulador WM_CREATE.

EnumDisplayMonitors lhe dará as coordenadas de cada monitor no sistema.


Evidentemente Delphi e C ++ Builder têm instalações que fazem esta resposta um pouco irrelevante. Vou deixá-lo aqui no caso de alguém se depara com esta questão, mas precisa que respondeu por um ambiente diferente.

Eu não fazer muito com sistemas Windows, então eu sugiro um hack como esta.

Grab a largura da área de trabalho visível (ambos os monitores combinados), dividi-lo pela metade e que a sua posição inicial fazer.

Você também pode olhar para o que api diz-lhe de Monitor2 dimensões.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top