我怎样才能找到任务栏的高度?

时间:2010-09-05 00:37:03

标签: c++ windows api height taskbar

在我的Windows应用程序中,我试图找到任务栏的高度。虽然我可以将其编程到我的程序中,但我希望以编程方式找到它以支持过去,现在(win7)和未来的Windows版本。

那么,我该怎么做?

5 个答案:

答案 0 :(得分:4)

通过在Google上搜索"height of taskbar c++",我得到了以下结果:

  

以下是使用Windows函数FindWindowGetWindowRect获取Windows任务栏的高度的方法。

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 :(得分:4)

你是从GetMonitorInfo(),MONITORINFOEX.rcWork成员那里得到的。

从MonitorFromRect()获取需要调用此函数的HMONITOR,传递窗口矩形。或者MonitorFromPoint()或EnumDisplayMonitors()取决于您要显示窗口的位置。 (0,0)始终位于主监视器的左上角。

答案 2 :(得分:4)

使用ABM_GETTASKBAR消息向Windows询问相关信息并指定任务栏的hwnd。

答案 3 :(得分:1)

可能你不仅想要Taksbar,还想要屏幕上的所有其他“酒吧”吗?

您实际需要的只是SystemParametersInfo(SPI_GETWORKAREA)

SystemParametersInfo,将SPI_GETWORKAREA作为参数传递

  

检索主显示器上工作区的大小。   工作区域是屏幕未被系统遮挡的部分   任务栏或应用程序桌面工具栏。 pvParam参数必须   指向接收工作坐标的RECT结构   区域,以虚拟屏幕坐标表示。

答案 4 :(得分:0)

根据您的需要,有许多方法。我使用了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;
}

任务栏的高度或宽度(取决于位置)通常分别是显示器的高度或宽度,但情况可能并非总是如此。