C# WindowStyle=None和windowmaximized hack不使用多个监视器

C# WindowStyle=None和windowmaximized hack不使用多个监视器,c#,wpf,winapi,window,window-chrome,C#,Wpf,Winapi,Window,Window Chrome,我遇到了一个问题,当窗口样式为“无”且窗口最大化时,窗口将覆盖任务栏。我从中得到了一个解决方案(我从源代码中得到了代码,而不是他发布的代码),除了一个部分外,它运行良好。当您有两个监视器,且主监视器比辅助监视器小时,则会使辅助监视器上的窗口最大化,这种情况会发生(请注意,窗口溢出屏幕): 这就是它的外观:(我刚刚将窗口调整为全屏。) 但它在这里起作用: 我正在做的是定制铬元素。所有代码和一个示例项目都已上载。另外,如果有人有任何其他的方法来做这件事,我会非常感激。提前谢谢 编辑以下是一些快

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

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

但它在这里起作用:

我正在做的是定制铬元素。所有代码和一个示例项目都已上载。另外,如果有人有任何其他的方法来做这件事,我会非常感激。提前谢谢

编辑以下是一些快速参考代码:

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);
    }

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

我在Windows 8.1上测试了您的代码,问题再次出现。因此,我检查了您的WmGetMinMaxInfo函数,发现覆盖MINMAXINFO的值,WM_GETMINMAXINFO的LPRAM是正确的,但是在次要监视器大于主要监视器的情况下,ptMaxSize没有正确反映出来。维尔德

我自己使用WindowChrome开发了自定义窗口,并在设置
WindowStyle=None
时体验了一些奇妙的事情。因此我个人建议使用
GlassFrameThickness=0
CornerRadius=0
而不是
WindowsStyle=None
AllowTransparency=True
,这样您就不再需要这种破解了

因此,CustomChrome_初始化函数将为:

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);
  }
}
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);
  }
}
您的Window_StateChanged函数将是:

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);
  }
}
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);
  }
}

不过,我对影子没有把握。

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

无法理解,所以你到底想要不想要那个窗口盖任务栏?另外,我想没有人会下载你所有的项目。请发布与问题相关的代码。如果你看第一张图片,它显示应用程序太大,超出屏幕。这就是问题所在。是的,我想显示任务栏。哦,这就是问题所在。为了将来-编写精确的问题并在问题中显示代码是很好的。那么,您的代码中是否有正确的监视器和正确的工作区?如果您在“WmGetMinMaxInfo(System.IntPtr hwnd,System.IntPtr lParam)”中添加一个断点并对其进行调试,并注意到当您有正确的场景时,“rcWorkArea”真的很有趣。我不会为您调试。请在问题中添加详细信息,包括监视器分辨率、调试时的实际结果和预期结果。现在的问题是,我无法将AllowTransparency设置为true。但我们确实找到了解决办法。谢谢你的帮助,我对你的解决方案很感兴趣。请共享。windows 10改变了一切。你不需要我以前需要的东西。