win32:检测开始菜单是否自动隐藏?

问题描述:

我想在窗口底部放置一个窗口。如果开始菜单存在,我希望它位于开始菜单的顶部。如果不是(或者它是自动隐藏的),我仍然希望它的位置与开始菜单的位置相同,这意味着会有几个像素的间隙。win32:检测开始菜单是否自动隐藏?

目前,我得到了监视器工作区,将窗口放在底部,并总是偏移20像素左右。如果开始菜单不存在,这可以很好地工作。但是,如果是这样,工作区域也会缩小(因为它应该),并且我最终会实现双重抵消。

我该如何解决这个问题?

您是否在您的项目中使用或有权访问.NET?

如果是这样,您可以使用Screen.PrimaryScreen.WorkingArea.Height属性来确定不包括任务栏的屏幕底部。

您还可以通过获取Screen.PrimaryScreen.Bounds.Height属性(其中包括总高度值中的任务栏)来获取总屏幕高度。

比较这些值,如果它们相同,任务栏不存在。否则,任务栏是,您可以相应地进行调整。

+0

嗯我没有.NET,但我可能能够得到老派的win32 api调用信息.. – Claudiu 2010-10-26 17:33:38

+0

我认为即使它隐藏任务栏也需要几个像素。当任务栏不存在时,你如何获得它的高度,以便可以减去它? – 2010-10-27 04:01:32

+0

好点..我只是假设标准的win98为主题的一个单位高的任务栏 – Claudiu 2010-10-28 20:45:39

为了获得不是由系统任务栏或应用程序的桌面工具栏遮挡屏幕的工作区,你可以使用SystemParametersInfo()SPI_GETWORKAREAuiAction参数。参数必须指向接收工作区坐标的结构,用虚拟屏幕坐标表示。例如:

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

看起来像'SHAppBarMessage(ABM_GETTASKBARPOS,...)'可能是缺少的一块。 http://msdn.microsoft.com/en-us/library/bb762108%28VS.85%29.aspx – 2010-10-27 04:08:14

+0

你是对的:-)。我添加了一些丢失的东西。 – Vantomex 2010-10-27 04:57:51

+0

对不起,我使用Delphi实现更新。 – Vantomex 2010-10-27 05:04:33