0

当窗口样式为无并且窗口最大化以使窗口覆盖任务栏时,我遇到了问题。我从这里得到了一个解决方案(我从源代码中得到了代码,而不是他发布的),除了一个部分外,它运行良好。当您有两个监视器并且主监视器小于辅助监视器时,您可以最大化辅助监视器上的窗口,这会发生(注意窗口溢出到屏幕上):

窗户很大。

这就是它的外观:(我刚刚将窗口大小调整为全屏。)

手动调整大小

它在这里工作:

主监视器

我正在做的是制作定制的镀铬物。所有的代码和一个示例项目都在这里上传。另外,如果有人有其他方法可以做到这一点,我将不胜感激。提前致谢!

编辑 这里是一些快速参考的代码:

private static void WmGetMinMaxInfo(System.IntPtr hwnd, System.IntPtr lParam)
    {
        MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));

        // Adjust the maximized size and position to fit the work area of the correct monitor
        int MONITOR_DEFAULTTONEAREST = 0x00000002;
        System.IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);

        if (monitor != System.IntPtr.Zero)
        {
            MONITORINFO monitorInfo = new MONITORINFO();
            GetMonitorInfo(monitor, monitorInfo);
            RECT rcWorkArea = monitorInfo.rcWork;
            RECT rcMonitorArea = monitorInfo.rcMonitor;
            mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left);
            mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top) - 8;
            mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left);
            mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top) + 8;
            if (rcWorkArea.bottom == rcMonitorArea.bottom)//full screen (no taskbar)
                mmi.ptMaxSize.y--;//remove 1 px from the bottom for "Auto-hide taskbar" configuration
            mmi.ptMinTrackSize.x = (int)currentlyChangingWindow.MinWidth;
            mmi.ptMinTrackSize.y = (int)currentlyChangingWindow.MinHeight;
        }

        Marshal.StructureToPtr(mmi, lParam, true);
    }

我没有编写此代码,所以我真的不知道这里发生了什么。这就是我在这里的原因。

4

2 回答 2

3

我在 Windows 8.1 上测试了您的代码,并重现了问题。所以我检查了你的 WmGetMinMaxInfo 函数,发现覆盖 MINMAXINFO 的值,WM_GETMINMAXINFO 的 lParam 是正确的,但 ptMaxSize 没有正确反映在辅助监视器大于主监视器的情况下。奇怪。

我自己使用 WindowChrome 开发了自定义窗口,并在设置时遇到了一些奇怪的事情WindowStyle = None。所以我个人建议使用GlassFrameThickness = 0andCornerRadius = 0而不是WindowStyle = None然后AllowsTransparency = True你不再需要这个 hack。

因此,您的 CustomChrome_Initialized 函数将是:

void CustomChrome_Initialized(object sender, EventArgs e)
{
  if (CurrentWindow != null)
  {
    Chrome = new WindowChrome()
    {
      GlassFrameThickness = new Thickness(0),
      CornerRadius = new CornerRadius(0),
      ResizeBorderThickness = new Thickness(ResizeGripWidth)
    };

    WindowChrome.SetWindowChrome(CurrentWindow, Chrome);

    //DropShadow
    CurrentWindow.Effect = WindowEffect;
    CurrentWindow.StateChanged += Window_StateChanged;
    Window_StateChanged(CurrentWindow, EventArgs.Empty);
  }
}

并且您的 Window_StateChanged 函数将是:

void Window_StateChanged(object sender, EventArgs e)
{
  var window = ((Window)sender);
  if (window.WindowState == WindowState.Maximized)
  {
    window.BorderThickness = new Thickness(ResizeGripWidth);
  }
  else
  {
    window.BorderThickness = new Thickness(0);
  }
}

不过我不确定影子。

于 2014-10-01T00:50:28.733 回答
-1

我找到了自己问题的答案。这真的很复杂,所以如果没有人评论,我不会发布答案。

于 2014-10-02T10:32:18.417 回答