Wpf AppBar应用程序在Windows 8.x/10中无法正常工作(多个AppBar不会减少桌面工作区)

Wpf AppBar应用程序在Windows 8.x/10中无法正常工作(多个AppBar不会减少桌面工作区),wpf,appbar,Wpf,Appbar,我有一个应用程序,它的功能是“应用程序桌面工具栏”,简称appbar。它是在WPF中实现的,appbar功能是按照以下准则添加的: 在Windows 7中一切正常,但在Windows 8.1(或可能在Windows 8.x中)中会发生以下情况: 停靠在显示器一侧的第一个appbar将正确显示,Windows桌面的工作区域将相应减少,以便appbar不会与任何窗口重叠 与第一个appbar停靠在显示器同一侧的第二个appbar将显示在正确的位置,但Windows桌面的工作区域不会缩小。因此,第二个

我有一个应用程序,它的功能是“应用程序桌面工具栏”,简称appbar。它是在WPF中实现的,appbar功能是按照以下准则添加的:

在Windows 7中一切正常,但在Windows 8.1(或可能在Windows 8.x中)中会发生以下情况:

  • 停靠在显示器一侧的第一个appbar将正确显示,Windows桌面的工作区域将相应减少,以便appbar不会与任何窗口重叠
  • 与第一个appbar停靠在显示器同一侧的第二个appbar将显示在正确的位置,但Windows桌面的工作区域不会缩小。因此,第二个appbar现在与其他窗口重叠
  • 停靠在显示器同一侧的第三个appbar与第二个appbar的作用相同
  • 第四个(以及之后的所有appbars)位于前三个的上方/下方,因此appbars实际上开始消失
  • 步骤2中的代码如下(在Windows 8.1中调试):

    召唤

    SHAppBarMessage((int)ABMsg.ABM_QUERYPOS,参考barData)

    返回新appbar的正确调整坐标。但是后来打电话

    SHAppBarMessage((int)ABMsg.ABM_SETPOS,参考barData)

    似乎没有“通过”,这意味着它执行ok,稍后窗口将设置在正确的位置(在barData中定义)。但是工作区域并没有减少,据我所知,这应该通过这个函数调用来实现

    步骤4中发生的情况是,ShappArmMessage((int)ABMsg.ABM_QUERYPOS,ref barData)开始返回错误的坐标,这些坐标与已经存在的appbars相同。结果是AppBar彼此重叠

    同样的问题也出现在Windows 10中,但似乎有着更严重的副作用:我的appbar应用程序很快就会因多个appbar实例而崩溃,整个Windows操作系统会暂停几分钟

    我已经在网上搜索了相当广泛的内容,但没有找到解决方案。我发现这篇文章中的症状与我的应用程序中的症状非常相似


    任何帮助都将不胜感激。我猜这是Windows8.x/10中ShappArmMessageAPI的一个bug。但是,在确认是这样或更好之前,我们不会停止查找。在windows 8和windows 10中,ABM_QUERYPOS并不总是在第一次调用时返回正确的位置。但是,再次调用ABM_QUERYPOS,可以从Windows获得正确的位置。取决于应用程序栏的数量。 作为示例,此代码获得正确的位置:

            APPBARDATA abd = new APPBARDATA();
            abd.cbSize = Marshal.SizeOf(abd);
            abd.hWnd = this.Handle;
            abd.uEdge = (int)ABEdge.ABE_TOP;
            abd.rc.left = 0;
            abd.rc.right = SystemInformation.PrimaryMonitorSize.Width;
            abd.rc.top = 0;
            abd.rc.bottom = Size.Height;
    
            // Query the system for an approved size and position. 
            int top = abd.rc.top;
            for (;;)
            {
                SHAppBarMessage((int)ABMsg.ABM_QUERYPOS, ref abd);
                if (top == abd.rc.top)
                    break;
                top = abd.rc.top;
                abd.rc.bottom = abd.rc.top + Size.Height;
            }
    
    在Windows 8或Windows 10中,桌面区域并非总是像在Windows 7中那样被正确修改。 目前,桌面区域可以通过下一个代码进行调整。在windows 10中,避免使用 SPIF_SendwiniChange不工作

        private const Int32 SPIF_change = SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE;
    
            MoveWindow(abd.hWnd, abd.rc.left, abd.rc.top, 
                abd.rc.right - abd.rc.left, abd.rc.bottom - abd.rc.top, true);
    
    
                RECT final_working_area = new RECT();
                result = SystemParametersInfo(SPI_GETWORKAREA,
                                                      0,
                                                      ref final_working_area,
                                                      SPIF_change);
                // Verify working area was adjusted
                if (final_working_area.top < abd.rc.bottom)
                {
                    final_working_area.top = abd.rc.bottom;
                    result = SystemParametersInfo(SPI_SETWORKAREA,
                                                          0,
                                                          ref final_working_area,
                                                          SPIF_change);
                }
    
    private const Int32 SPIF_change=SPIF_UPDATEINIFILE | SPIF_sendwinichange;
    移动窗口(abd.hWnd、abd.rc.左侧、abd.rc.顶部、,
    abd.rc.right-abd.rc.left,abd.rc.bottom-abd.rc.top,true);
    RECT最终工作区=新RECT();
    结果=系统参数信息(SPI_GETWORKAREA,
    0,
    参考最终工作区域,
    SPIF_变化);
    //确认工作区域已调整
    if(最终工作区顶部<底部)
    {
    最终工作区顶部=底部;
    结果=系统参数信息(SPI_设置工作区,
    0,
    参考最终工作区域,
    SPIF_变化);
    }
    
    这并不能回答这个问题。一旦你有足够的钱,你将能够;相反谢谢你,我正试图提供帮助,并提供一个提示,我希望有一位有足够声誉的专家提供最终解决方案。我还认为存在一些与ABM_QUERYPOS和SPI_SETWORKAREA相关的bug。@pslzr:谢谢你的提示。的确,多次调用ABM_QUERYPOS确实会让Windows最终给出正确的位置。但最大的问题是工作区不适合居住。试图通过在代码中显式设置工作区来处理工作区将是一项艰巨的任务,因为可能有任意数量的AppBar停靠在显示器的任何一侧。我认为要有力地管理它是不可能的。我投入的时间越多,我几乎可以肯定这是一个Windows错误。我真的希望能找到解决办法,因为这对我的应用程序使用来说是一个巨大的问题。嗨,Jone,在这个问题上运气好吗?我也面临同样的问题。我们有WPF AppBar应用程序,它在Win7中运行良好,在Win10表面机器中出现问题。