Как мне получить полезные координаты экрана в Delphi

StackOverflow https://stackoverflow.com/questions/1424920

Вопрос

С помощью Screen.DesktopHeight и Screen.DesktopWidth я могу получить размер "виртуального" рабочего стола, и я считаю, что это работает для одного или нескольких мониторов.

Я сохраняю позицию (вверху и слева) и размер (высота и ширина) моего приложения в реестре, когда оно закрывается.Когда он откроется, я хочу убедиться, что он полностью виден, поскольку, возможно, он был частично перемещен за пределы видимой области, или размер экрана мог измениться, например, из-за настроек экрана или удаления монитора.

В принципе, я могу сделать это с помощью этого кода:

if MyForm.Width > screen.DesktopWidth then 
  MyForm.Width := screen.DesktopWidth;

if MyForm.Height > screen.DesktopHeight then 
  MyForm.Height := screen.DesktopHeight;

if (MyForm.Left + MyForm.Width) > screen.DesktopWidth then 
  MyForm.Left := screen.DesktopWidth - MyForm.Width;
if MyForm.Left < 0 then MyForm.Left := 0;

if (MyForm.Top + LogoAppForm.Height) > screen.DesktopHeight then 
  MyForm.Top := screen.DesktopHeight - LogoAppForm.Height;
if MyForm.Top < 0 then MyFormTop := 0;

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

Как я могу получить полезные настройки положения и размера экрана, которые исключают расположение панели задач?

Это было полезно?

Решение

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

Я использую Screen.MonitorCount и массив Screen.Monitors, чтобы определить, какой монитор содержит большую часть окна, а затем найти подходящий прямоугольник на этом экране. Свойство WorkareaRect TMonitor предоставляет границы рабочей области на конкретном мониторе, исключая любые панели задач или панели инструментов.

Другие советы

Вам следует использовать Screen .Рабочая область* свойства:

  Screen.WorkAreaRect
  Screen.WorkAreaHeight
  Screen.WorkAreaLeft
  Screen.WorkAreaTop
  Screen.WorkAreaWidth

или

Screen.Monitors[I].WorkareaRect

Чтобы определить рабочую область для текущей формы, используйте Monitor.WorkareaRect. например.

BoundsRect := Monitor.WorkareaRect;

установить максимальный размер формы, не увеличивая ее.

Вам также следует взглянуть на

scroll top