Wpf AppBar应用程序在Windows 8.x/10中无法正常工作(多个AppBar不会减少桌面工作区)
我有一个应用程序,它的功能是“应用程序桌面工具栏”,简称appbar。它是在WPF中实现的,appbar功能是按照以下准则添加的: 在Windows 7中一切正常,但在Windows 8.1(或可能在Windows 8.x中)中会发生以下情况: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桌面的工作区域不会缩小。因此,第二个
任何帮助都将不胜感激。我猜这是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表面机器中出现问题。