win32: определить, является ли меню «Пуск» автоматически скрытым? - PullRequest
0 голосов
/ 26 октября 2010

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

В настоящее время я получаю рабочую область монитора, располагаю окно внизу и всегда смещаюсь на 20 пикселей или около того. Если меню «Пуск» там нет, это работает хорошо. Если это, однако, рабочая область также сжимается (как и должно быть), и в итоге я получаю двойное смещение.

Как бы я решил проблему?

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Чтобы получить рабочую область экрана, не затененную системной панелью задач или панелями инструментов рабочего стола приложения, вы можете использовать SystemParametersInfo () с SPI_GETWORKAREA в качестве параметра uiAction . Параметр pvParam должен указывать на структуру RECT, которая получает координаты рабочей области, выраженные в координатах виртуального экрана. Например:

  RECT rectWorkArea;
  SystemParametersInfo(SPI_GETWORKAREA, 0, &rectWorkArea, 0);

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

Чтобы определить положение панели задач (находится ли она в данный момент внизу, сверху, слева или справа от экрана), вы можете использовать следующий расчет:

  type
    TTaskBarPos = (_TOP, _BOTTOM, _LEFT, _RIGHT);
  var
    iScrW, iScrH: Longint;

  iScrW := GetSystemMetrics(SM_CXSCREEN);
  iScrH := GetSystemMetrics(SM_CXSCREEN);

  if (rectTaskbar.Top > iScrH div 2) and (rectTaskbar.Right >= iScrW) then
    Result := _BOTTOM
  else if (rectTaskbar.Top < iScrH div 2) and (rectTaskbar.Bottom <= iScrW div 2) then
    Result := _TOP
  else if (rectTaskbar.Left < iScrW div 2) and (rectTaskbar.Top <= 0) then
    Result := _LEFT
  else
    Result := _RIGHT;

Их должно быть достаточно, чтобы решить вашу текущую проблему. Однако, если вам нужно знать (по другой причине) текущие настройки панели задач для состояний автоматического скрытия и всегда наверху, вы можете использовать SHAppBarMessage(ABM_GETSTATE, ...).

Если вам необходимо получить уведомление о том, что состояние автоматического скрытия или всегда наверху панели задач изменилось, вам необходимо перехватить сообщение ABN_STATECHANGE .

0 голосов
/ 26 октября 2010

Вы используете или имеете доступ к .NET в своем проекте?

Если это так, вы можете использовать свойство Screen.PrimaryScreen.WorkingArea.Height для определения нижней части экрана, исключая панель задач.

Вы также можете получить общую высоту экрана, получив свойство Screen.PrimaryScreen.Bounds.Height (которое включает панель задач в значение общей высоты).

Сравнивая эти значения, если они совпадают, панель задач отсутствует. В противном случае панель задач и вы можете настроить соответственно.

...