Как мне найти высоту панели задач? - PullRequest
4 голосов
/ 05 сентября 2010

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

Итак, как бы я это сделал?

Ответы [ 5 ]

4 голосов
/ 05 сентября 2010

Вы получаете его от GetMonitorInfo(), члена MONITORINFOEX.rcWork.

Получите HMONITOR, который вам нужен для вызова этой функции, скажем, из MonitorFromRect (), минуя прямоугольник окна. Или MonitorFromPoint () или EnumDisplayMonitors (), зависит от того, где вы хотите отобразить свое окно. (0,0) всегда верхний левый угол основного монитора.

4 голосов
/ 05 сентября 2010

Спросите Windows об этом, используя сообщение ABM_GETTASKBAR и указав hwnd для панели задач.

4 голосов
/ 05 сентября 2010

При поиске в Google по запросу "высота панели задач c ++" я получил следующий результат:

Вот как получить высоту панели задач Windows с помощью функций WindowsFindWindow и GetWindowRect.

int MyClass::getTaskBarHeight()
{
    RECT rect;
    HWND taskBar = FindWindow(L"Shell_traywnd", NULL);
    if(taskBar && GetWindowRect(taskBar, &rect)) {
        return rect.bottom - rect.top;
    }
}

Получение ширины (если панель задач находится слева или справа от экрана) может быть выполненоиспользуя:

rect-right - rect.left

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

1 голос
/ 27 сентября 2011

Возможно, вам нужен не только Taksbar, но и все другие «бары» на экране?

Все, что вам на самом деле нужно, это SystemParametersInfo(SPI_GETWORKAREA)

SystemParametersInfo , передачаSPI_GETWORKAREA как параметр

Извлекает размер рабочей области на основном мониторе монитора.Рабочая область - это часть экрана, не скрытая системной панелью задач или панелями инструментов рабочего стола приложения.Параметр pvParam должен указывать на структуру RECT, которая получает координаты рабочей области, выраженные в координатах виртуального экрана.

0 голосов
/ 16 ноября 2014

Есть множество методов в зависимости от ваших потребностей.Я использовал EnumDisplayMonitors (), поскольку мне нужно было протестировать каждый дисплей, чтобы увидеть, есть ли на нем панель задач.Это можно сделать следующим образом:

Используйте EnumDisplayMonitors () , чтобы получить список всех мониторов.

MyInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)

Внутри обратного вызова вы получите дескриптордисплей. Предупреждение: эта функция также будет перечислять виртуальные дисплеи: Используя дескриптор для дисплея, используйте GetMonitorInfo () с дескриптором для дисплея.

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

Например, сначала мы проверяем Yось:

if(monitor->rcMonitor.top == monitor->rcWork.top &&
monitor->rcMonitor.bottom == monitor->rcWork.bottom)
{
std::cout << "There is no taskbar on the Y axis" << std::endl;
}
else
{
std::cout << "There is a taskbar on the Y axis" << std::endl;
int height = monitor->rcMonitor.bottom - monitor->rcMonitor.top;
int hieghtOfTaskbar = height - (monitor.rcWork.bottom - monitor.rcWork.top);
std::cout << "The height of the taskbar is: " << heightOfTaskbar << std::endl;
}

Затем мы проверяем ось X:

if(monitor->rcMonitor.right == monitor->rcWork.right &&
monitor->rcMonitor.left == monitor->rcWork.left )
{
std::cout << "There is no taskbar on the X axis" << std::endl;
}
else
{
std::cout << "There is a taskbar on the X axis" << std::endl;
int width = monitor->rcMonitor.left  - monitor->rcMonitor.right;
int widthOfTaskbar = height - (monitor.rcWork.left - monitor.rcWork.right);
std::cout << "The width of the taskbar is: " << heightOfTaskbar << std::endl;
}

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

...