c# - 我怎样才能调整窗口工作区的大小,然后更新其他窗口以反射(reflect)更改?

标签 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 顺序然后在之后恢复它,但没有运气)。

那么,有人能看出我这样做有什么问题吗,或者有人知道应该怎么做吗?

最佳答案

正确的做法是创建一个AppBar。请参阅 SHAppBarMessage。有一个 C++ 示例 in the Knowledge Base .有一个 C# 示例 on CodeProject .

关于c# - 我怎样才能调整窗口工作区的大小,然后更新其他窗口以反射(reflect)更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7609983/

相关文章:

c# - CSharp 脚本,是否可以从使用 csi.exe 运行的脚本返回值?

c# - 从 Xbap 打开新页面

c# - 使用Newtonsoft如何避免 ":"后的tailing space空间

c++ - 如何使用 Windows API 列出目录中的文件?

c# - jQuery可拖动图像,鼠标越界时停止拖动(div)

c++ - GetLogicalDriveStrings,为什么是字符串列表

c++ - 正在使用未初始化的变量

html - 如何在调整页面大小时防止 div 移动?

java - 如何随着窗口大小的调整而调整 JLabel 中图像的大小?如何保持适当的规模?

css - 使用 CSS 将 <div> 调整为小于其当前宽度和高度的尺寸