首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF多显示器问题- WindowState

WPF多显示器问题- WindowState
EN

Stack Overflow用户
提问于 2009-12-23 23:15:58
回答 2查看 11.6K关注 0票数 4

一段时间以来,我一直在尝试让我的WPF应用程序跨越多个监视器,并且几乎可以正常工作了。

当我设置以下行时,问题似乎出现了:

代码语言:javascript
复制
win1.WindowState = WindowState.Maximized

这会导致应用程序仅跨越主屏幕。

我的代码如下:

代码语言:javascript
复制
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        Window1 win1 = new Window1();
        win1.WindowStartupLocation = WindowStartupLocation.Manual;
        win1.Width = 2560;
        win1.Height = 1024;
        win1.Left = 0;
        win1.Top = 0;
        win1.Topmost = true;
        win1.Background = new SolidColorBrush(Colors.Black);
        win1.WindowStyle = WindowStyle.None;
        win1.Show();
        win1.Focus();
    }
}

在窗口1的内部:

代码语言:javascript
复制
public partial class Window1 : Window
{
    public Window1()
    {

    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        WindowState = WindowState.Maximized;
    }
}

此示例可以工作,但窗口未最大化,并且应用程序边界仍然可见。

在Application_Startup中包含最大减速使监视器最大化到主监视器。

为什么会这样呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-24 10:08:33

首先请注意,“最大化”的概念是与单个监视器绑定在一起的,因此您不能在多个监视器上真正实现最大化窗口。当然,在WPF中,您可以创建自己的窗口框架,并在其中绘制您喜欢的任何内容,因此,如果您愿意,您当然可以让用户认为窗口是最大化的,并且跨越多个屏幕。

还需要注意的是,仅在两种情况下,使用一个矩形窗口跨越两个监视器是可能的:

  1. 两个显示器具有相同的高度并配置为并排,或
  2. 两个显示器具有相同的宽度并配置为上下。

否则,您将需要使用两个单独的窗口来覆盖两个显示器的整个表面,或者使用包含任何显示器都未覆盖的区域的大窗口。

好的,下面是如何获取定位窗口所需的信息:

WPF本身不提供询问监视器数量、分辨率或相对位置的方法。幸运的是,我们可以使用DllImport直接调用Win32。要获得显示器分辨率和布局,只需:

在User32.dll

  • Write中为EnumDisplayMonitors和GetMonitorInfo声明MONITORINFO结构为结构,这两个方法都可以在EnumDisplayMonitors中找到,该方法调用EnumDisplayMonitors并传递一个委托,该委托获取监视器信息并将其以列表形式返回。

这里是基本的想法:

代码语言:javascript
复制
List<MONITORINFO> GetAllMonitorInfo()
{
  var result = List<MONITORINFO>();
  EnumDisplayMonitors(null, null,
    (hMonitor, hdcMonitor, lprcMonitor, dwData) =>
    {
      var info = new MONITORINFO { cbSize = Marshall.Sizeof(typeof(MONITORINFO)) };
      GetMonitorInfo(hMonitor, ref info);
      result.Add(info);
    }, null);
  return result;
}

有了监视器坐标后,使用您选择的算法来选择要创建的窗口数量以及每个窗口的坐标。然后使用显式大小和位置创建窗口。

请注意,您可能希望使用rcWork而不是rcMonitor,这样就不会覆盖开始菜单等。

还请注意,在许多情况下,返回的某些坐标将为负,例如,如果辅助监视器位于主监视器的左侧。这不是问题:只需使用给定的坐标,您的窗口就会出现在正确的位置。

票数 12
EN

Stack Overflow用户

发布于 2009-12-24 05:11:32

如果您总是可以假设您的辅助监视器与主监视器的分辨率相同,则可以实现如下内容:

//使用这是您关心的任务栏高度workArea = SystemParameters.WorkArea;this.Width = SystemParameters.PrimaryScreenWidth * 2;this.Height = workArea.Bottom;this.Left = 0;this.Top = 0;

或者:

//使用该选项是因为您不关心任务栏高度this.Width = SystemParameters.PrimaryScreenWidth * 2;this.Height = SystemParameters.PrimaryScreenHeight;this.Left = 0;this.Top = 0;

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1953363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档