Запустить программу на втором мониторе?
есть ли способ указать, на каком мониторе отображается приложение в Delphi или C++Builder?
Я разрабатываю простую программу для клиента, которая отображает кухонные заказы на вторичном мониторе, генерируемом системой гостеприимства. В настоящее время им нужно вручную перетащить окно на второй монитор после его запуска.
7 ответов
сохраните положение окна перед выключением программы и восстановите их при запуске. Мультимониторные дисплеи просто увеличивают размер рабочего стола; другие поверхности монитора просто имеют другой раздел той же плоскости X/Y с ее началом в левом верхнем углу основного монитора.
Это может быть сделано автоматически для вас любой из нескольких компонентов.
BTW, переменная экрана в блоке форм имеет свойство под названием MonitorCount и другое индексируемое свойство, мониторы[индекс: целое число]: TMonitor. TMonitor имеет свойства, указывающие на левый, верхний, ширину, высоту и т. д. так что вся информация, которая вам нужна, там.
глобальный объект экрана (часть форм) имеет понятие мониторов. Я думаю, что это было добавлено около 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;
можно использовать любое положительное смещение от этой позиции, чтобы поместить его в любом месте на экране. Вы можете получить ширину и высоту, оттуда тоже знать размеры.
не совсем ответ на ваш вопрос подразумевает, но не могли бы вы сохранить настройки окна (размер, положение, максимальное состояние), когда приложение закрыто, а затем применить их при запуске?
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;
Я сделал аналогичную вещь некоторое время назад в 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 позволит вам указать координаты окна в вызове API CreateWindow. Я недостаточно знаю о Delphi или C++Builder, чтобы знать, есть ли у вас доступ к этой части процесса.
вы также можете переместить окно в обработчике WM_CREATE.
EnumDisplayMonitors даст вам координаты каждого монитора в системе.
Очевидно, Delphi и C++ Builder имеют средства, которые делают этот ответ несколько неактуальным. Я оставьте его здесь, Если кто-то столкнется с этим вопросом, но нуждается в ответе для другой среды.
Я не очень много делаю с системами windows, поэтому я бы предложил такой хак.
захватите ширину видимого рабочего стола (оба монитора объединены), разделите его пополам и сделайте это своей начальной позицией.
вы также можете посмотреть, что api говорит вам о размерах monitor2.