Чтобы получить рабочую область экрана, не затененную системной панелью задач или панелями инструментов рабочего стола приложения, вы можете использовать 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 .