【问题标题】:Appbar gets moved when desktop area changes当桌面区域更改时,Appbar 会移动
【发布时间】:2021-03-17 00:48:22
【问题描述】:

我已经实现了一个常规的 Appbar。但是,一旦我取消注册并再次注册它(即 ABM_REMOVE 后跟 ABM_NEW),appbar 表单现在沿着桌面调整大小移动,就好像它是一个常规窗口一样,而不是按照 MoveWindow 的要求移动到屏幕边缘打电话。

试图了解我是否做错了什么。任何人都可以复制这种行为吗?添加下面的代码,以防万一。非常感谢!

public void RegisterBar(Form1 form1)
{
    APPBARDATA abd = new APPBARDATA();
    abd.cbSize = Marshal.SizeOf(abd);
    abd.hWnd = form1.Handle;
    if (!fBarRegistered)
    {
        uCallBack = RegisterWindowMessage("AppBarMessage");
        abd.uCallbackMessage = uCallBack;

        //+ (int)ABMsg.ABM_SETAUTOHIDEBAR
        uint ret = SHAppBarMessage((int)ABMsg.ABM_NEW, ref abd);
        fBarRegistered = true;
        ABSetPos(form1);
    }
    else
    {
        SHAppBarMessage((int)ABMsg.ABM_REMOVE, ref abd);
        fBarRegistered = false;
    }
}

public void ABSetPos(Form1 form1)
{
    APPBARDATA abd = new APPBARDATA();
    abd.cbSize = Marshal.SizeOf(abd);
    abd.hWnd = form1.Handle;
    abd.uEdge = (int)ABEdge.ABE_RIGHT;

    if (abd.uEdge == (int)ABEdge.ABE_LEFT || abd.uEdge == (int)ABEdge.ABE_RIGHT)
    {
        abd.rc.top = 0;
        abd.rc.bottom = SystemInformation.PrimaryMonitorSize.Height;
        if (abd.uEdge == (int)ABEdge.ABE_LEFT)
        {
            abd.rc.left = 0;
            abd.rc.right = form1.Size.Width;
        }
        else
        {
            abd.rc.right = SystemInformation.PrimaryMonitorSize.Width;
            abd.rc.left = abd.rc.right - form1.Size.Width;
        }

    }
    else
    {
        abd.rc.left = 0;
        abd.rc.right = SystemInformation.PrimaryMonitorSize.Width;
        if (abd.uEdge == (int)ABEdge.ABE_TOP)
        {
            abd.rc.top = 0;
            abd.rc.bottom = form1.Size.Height;
        }
        else
        {
            abd.rc.bottom = SystemInformation.PrimaryMonitorSize.Height;
            abd.rc.top = abd.rc.bottom - form1.Size.Height;
        }
    }

    SHAppBarMessage((int)ABMsg.ABM_QUERYPOS, ref abd);

    switch (abd.uEdge)
    {
        case (int)ABEdge.ABE_LEFT:
            abd.rc.right = abd.rc.left + form1.Size.Width;
            break;
        case (int)ABEdge.ABE_RIGHT:
            abd.rc.left = abd.rc.right - form1.Size.Width;
            break;
        case (int)ABEdge.ABE_TOP:
            abd.rc.bottom = abd.rc.top + form1.Size.Height;
            break;
        case (int)ABEdge.ABE_BOTTOM:
            abd.rc.top = abd.rc.bottom - form1.Size.Height;
            break;
    }

    SHAppBarMessage((int)ABMsg.ABM_SETPOS, ref abd);
    MoveWindow(abd.hWnd, abd.rc.left, abd.rc.top,
            abd.rc.right - abd.rc.left, abd.rc.bottom - abd.rc.top, true);
}

【问题讨论】:

    标签: c# appbar


    【解决方案1】:

    据我所知,这只是默认行为。必须在取消注册和重新注册之间移动表单,以避免在桌面调整大小时移动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-05-21
      • 1970-01-01
      相关资源
      最近更新 更多