WPF 多显示器问题 - WindowState [英] WPF mutli-monitor problem - WindowState

查看:25
本文介绍了WPF 多显示器问题 - WindowState的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I've been trying to get my WPF application to span multiple monitors for some time now and nearly have it working.

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

The problem seems to arise when I set the following line:

win1.WindowState = WindowState.Maximized

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

This causes the application to span only the primary screen.

我的代码如下:

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 内部:

public partial class Window1 : Window
{
    public Window1()
    {

    }

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

此示例有效,但窗口未最大化,并且应用程序边框仍然可见.

This example works, but the window is not maximized, and the application borders are still visible.

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

Including the maximized deceleration in Application_Startup makes the monitor maximize to the primary monitor.

这是为什么?

推荐答案

首先请注意,最大化"的概念与单个显示器相关联,因此您无法真正在多个显示器上实现最大化窗口.当然,在 WPF 中,您可以创建自己的窗口框架并在其中绘制任何您喜欢的内容,因此如果您愿意,您当然可以让用户认为窗口已最大化并跨越多个屏幕.

First note that the concept of "Maximized" is tied to a single monitor, so you cannot truly have a maximized window on multiple monitors. Of course in WPF you can create your own window frame and draw anything you like in it, so if you want you can certainly make the user think the window is maximized and spanning multiple screens.

另请注意,仅在两种情况下,一个矩形窗口可以跨越两个显示器:

Also note that it is possible to span two monitors with a single rectangular window in only two cases:

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

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

Otherwise you will need to use two separate windows to cover the entire surfaces of both monitors, or use a large window that includes areas that aren't covered by any monitor.

好的,以下是获取定位窗口所需信息的方法:

Ok, here's how to get the information you'll need to position your window(s):

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

WPF itself does not provide a way to ask about your monitor count, resolutions, or relative positions. Fortunately we can call Win32 directly using [DllImport]. To get monitor resolutions and layouts, just:

  1. 在 C# 中将 MONITORINFO 结构声明为结构
  2. 为 EnumDisplayMonitors 和 GetMonitorInfo 声明 DllImports,两者都在 User32.dll 中
  3. 编写一个方法,该方法调用 EnumDisplayMonitors 并传递一个获取监视器信息并在列表中返回它的委托.

这是基本思想:

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

获得监视器坐标后,使用您选择的算法来选择要创建的窗口数量以及每个窗口需要的坐标.然后使用明确的大小和位置创建窗口.

Once you have the monitor coordinates, use an algorithm of your choice to select how many window(s) you want to create and what coordinates you want for each one. Then create the windows using explicit size(s) and location(s).

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

Note that you'll probably want to use rcWork as opposed to rcMonitor so you don't overwrite the start menu, etc.

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

Also note that in many cases some of the coordinates returned will be negative, for example if the secondary monitor is to the left of the primary monitor. This is not a problem: Just use the coordinates as given and your windows will appear in the correct places.

这篇关于WPF 多显示器问题 - WindowState的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆