2008-10-15 5 views
17

Есть ли способ указать, какой монитор приложение появляется в Delphi или C++ Builder?Запустить программу на втором мониторе?

Я разрабатываю простую программу для клиента, которая отображает заказы на кухне на дополнительном мониторе, создаваемом системой гостеприимства. В настоящее время им нужно вручную перетащить окно на второй монитор после его запуска.

ответ

22

Сохраните положение окна перед выключения программы и восстановите их при запуске. Мультимониторные дисплеи просто увеличивают размер рабочего стола; на других поверхностях монитора имеется только другой участок одной и той же плоскости X/Y с его началом в левом верхнем углу основного монитора.

Это может быть сделано автоматически для вас any of several components.

BTW, переменная экрана в модуле Forms имеет свойство MonitorCount и другое индексируемое свойство, Monitors [Index: Integer]: TMonitor. TMonitor имеет свойства, указывающие левый, верхний, ширина, высоту и т. Д., Поэтому вся необходимая информация есть.

+0

Спасибо, я использовал Screen.MonitorCount, как вы и Джим. – stukelly

+6

Вы должны также проверить сохраненный монитор перед использованием настроек при запуске. В противном случае ваше окно вообще не появится на экране, если пользователь удалит монитор, который был там. – anon6439

+0

Запуск приложения на негативных координатах экрана всегда интересно наблюдать за пользователями, как получить приложение для показа ... –

-4

Я не очень сильно разбираюсь в системах Windows, поэтому я предложил бы такой взломать.

Захватите ширину просматриваемого рабочего стола (оба монитора вместе взятые), разделите его на половину и сделайте это исходное положение.

Вы также можете посмотреть, что api сообщает вам размеры монитора2.

+1

Это будет работать только тогда, когда оба монитора имеют один и тот же рабочий стол размер. – Re0sless

+0

@ReOsless: Ya. Как я уже сказал, это взломать. –

-3

Windows позволит вам указать координаты окна в вызове API CreateWindow. Я не знаю достаточно о Delphi или C++ Builder, чтобы узнать, есть ли у вас доступ к этой части процесса.

Возможно, вы также сможете переместить окно в обработчике WM_CREATE.

EnumDisplayMonitors предоставит вам координаты каждого монитора в системе.


Очевидно, что у Delphi и C++ Builder есть средства, которые делают этот ответ несколько неуместным. Я оставлю его здесь, если кто-то столкнется с этим вопросом, но ему нужно, чтобы он отвечал за другую среду.

+2

В Delphi есть абстракции, которые охватывают все эти функции, начиная с собрания Screen.Monitors и заканчивая событиями предварительной сборки для управления положением формы. –

1

Не совсем ответ на ваш вопрос, но не можете ли вы сохранить настройки окна (размер, положение, максимальное состояние), когда приложение закрыто, а затем применить их при запуске?

+0

Это простейшая реализация. – benPearce

+2

Существует проблема с этим.Что произойдет, если второй монтор будет удален с компьютера после того, как приложение его использует? (MySql Query Brower имеет эту проблему) –

25

Глобальный экранный объект (часть форм) имеет концепцию мониторов. Я думаю, что это было добавлено около Delphi 6 или 7. Следующий код будет работать:

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

Вы можете использовать любое положительное смещение от этой позиции, чтобы поместить его в любом месте в этом мониторе. Вы можете получить ширину и высоту оттуда, чтобы узнать размеры.

+1

Спасибо за образец кода, он отлично поработал. – stukelly

-2

я сделал нечто подобное некоторое время назад в 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; 
1
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; 
Смежные вопросы