代码之家  ›  专栏  ›  技术社区  ›  Claudiu

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

  •  0
  • Claudiu  · 技术社区  · 13 年前

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

    我该如何解决这个问题?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Vantomex    13 年前

    要使屏幕的工作区不被系统任务栏或应用程序桌面工具栏遮挡,可以使用 SystemParametersInfo() 具有 SPI_GETWORKAREA 作为 行动 参数。这个 变参数 参数必须指向 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 留言。

        2
  •  0
  •   George Johnston    13 年前

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

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

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

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