如何调整Windows工作区的大小,然后更新其他窗口以反映更改?

时间:2011-09-30 11:56:33

标签: c# winapi resize window

我有一个工具栏应用程序,可以更改桌面的工作区域,并将自己定位在间隙中(位于屏幕的顶部或底部)。我需要一个功能,它将调整其他窗口的大小,以便在调整大小后它们不会留在工具栏后面(工具栏总是在顶部)。我正在使用下面的功能来更改工作区域:

private bool SetWorkspace(RECT rect)
        {
            bool result = SystemParametersInfo(SPI_SETWORKAREA,
                                      0,
                                      ref rect,
                                      SPIF_change);
            if (!result)
           {
               MessageBox.Show("The last error was: " +
                               Marshal.GetLastWin32Error().ToString());
           }

          this.minAll();
          return result;
        }

和minAll()函数就是我如何调整其他窗口的大小:

public void minAll(){
            IntPtr lHwnd = FindWindow("Shell_TrayWnd", null);
            SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL, IntPtr.Zero);
            System.Threading.Thread.Sleep(10);
            SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL_UNDO, IntPtr.Zero);
            System.Threading.Thread.Sleep(10);              
         }

这种方法有效,因为工作区确实调整了大小并且没有窗口保持其旧位置,但是存在一些问题:

  • 正常(即,未最大化或最小化)窗口有时会这样做 很小,他们没有显示,必须从最大化 任务栏(Vista)可见
  • 有时这种方法会产生其他方法 当它们不应该
  • 时,它们总是在顶部
  • 它改变了窗口的z顺序,似乎是随机的

如果你关闭并重新打开受影响的窗口,前两个问题就解决了,但这不是一个理想的解决方案,我甚至无法手动纠正z顺序(我尝试在方法之前保存z顺序)然后恢复它,但没有运气)。

那么,任何人都可以看到我这样做有什么不对,或者有人知道应该怎么做吗?

1 个答案:

答案 0 :(得分:4)

正确的方法是创建一个AppBar。见SHAppBarMessage。有一个C ++示例in the Knowledge Base。有一个C#样本on CodeProject