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

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

win1.WindowState = WindowState.Maximized

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

我的代码如下:

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

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

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

为什么是这样?

最佳答案

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

另请注意,仅在两种情况下,可以使用单个矩形窗口跨越两个监视器:

  • 两台显示器高度相同,并配置为并排,或
  • 两台显示器宽度相同,配置为上下。

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

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

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

  • 将 MONITORINFO 结构声明为 C# 中的结构
  • 为 EnumDisplayMonitors 和 GetMonitorInfo 声明 DllImports,两者都在 User32.dll

中找到

  • 编写一个调用 EnumDisplayMonitors 并传递一个委托(delegate)的方法,该委托(delegate)获取监视器信息并在列表中返回它。

这是基本思想:

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,这样您就不会覆盖开始菜单等。

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

关于WPF多显示器问题 - WindowState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1953363/

WPF多显示器问题 - WindowState的更多相关文章

  1. WPF 设置窗体大小为显示器工作区域大小

      最近做的项目遇到一个问题,窗体在1680*1050分辨率下显示,系统字体设置为小字体时,显示没问题,但是调到中等字体时,窗体显示位置出了问题.主窗体为无边框窗体,拖动及放大缩小事件都是自己写的. ...

  2. CS中调用微软自带com组件实现音频视频播放(wf/wpf)

    1.mp3播放器:工具箱中右键,在弹出的菜单中选择“选择项”,添加“com组件”,选择名称“windows Media Player",点击确定就会在工具箱新增一个“windows Medi ...

  3. 利用WPF创建含多种交互特性的无边框窗体

    咳咳,标题一口气读下来确实有点累,让我先解释一下.另外文章底部有演示程序的下载. 本文介绍利用WPF创建一个含有以下特性的窗口: 有窗口阴影,比如QQ窗口外围只有几像素的阴影: 支持透明且无边框,为了 ...

  4. WPF 获取屏幕分辨率(获取最大宽高)等

    double x = SystemParameters.WorkArea.Width;//得到屏幕工作区域宽度 double y = SystemParameters.WorkArea.Height; ...

  5. WPF换肤之三:WPF中的WndProc

    原文:WPF换肤之三:WPF中的WndProc 在上篇文章中,我有提到过WndProc中可以处理所有经过窗体的事件,但是没有具体的来说怎么可以处理的. 其实,在WPF中,要想利用WndProc来处理所 ...

  6. 使用WPF创建无边框窗体

    一.无边框窗口添加窗口阴影 实际上在WPF中添加无边框窗口的窗口阴影十分简单. 首先,设置WindowStyle="None"以及AllowsTransparency=" ...

  7. WPF多屏最大化

    如果计算机存在多个显示器,这时设置wpf窗口为最大化,窗口只能在主显示器中实现最大化,如果想要实现窗口拉伸至多屏,需要获取所有显示器分辨率之和.这时用到了System.Windows.SystemPa ...

  8. WPFの获取屏幕分辨率并自适应

    double x = SystemParameters.WorkArea.Width;//得到屏幕工作区域宽度 double y = SystemParameters.WorkArea.Height; ...

  9. WPF中使用WindowChrome自定义窗口中遇到的最大化问题

    FrameWork 4.5 之后,内置了WindowChrome类,官方文档: https://msdn.microsoft.com/en-us/library/system.windows.shel ...

  10. [WPF自定义控件]Window(窗体)的UI元素及行为

    1. 前言 本来打算写一篇<自定义Window>的文章,但写着写着发觉内容太多,所以还是把使用WindowChrome自定义Window需要用到的部分基础知识独立出来,于是就形成了这篇文章 ...

随机推荐

  1. 如何采用VuePress构建文档网站

    作者:倾城 博客: https://www.codingbrick.com 寄语:当你意识到面子不重要时,你才算个真正的成年人. 在建设博客的初期,我采用GitBook构建了编码专家的专栏系统.Git ...

  2. Excel 分组后计算

    分组后的计算都类似,仍然采用 groups 函数,分组并同时计算出各洲的 GDP 总量,然后再求一遍各洲的 GDP 总量占全球 GDP 的百分比值. SPL 代码如下:   A B 1 =clipbo ...

  3. redis 简单整理——redis shell[九]

    前言 简单介绍一下redis的shell命令. 正文 redis 提供了一些工具,如redis-cli.redis-server.redis-benchmark等. redis-cli -r 对red ...

  4. https http2 http3

    HTTP 1.1 对比 1.0,HTTP 1.1 主要区别主要体现在: 缓存处理:在 HTTP 1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判 ...

  5. python 多进程jieba分词,高效分词,multiprocessing

    自然语言任务经常使用jieba分词,数据量大时怎么加速,jieba分词不支持使用asyncio异步加速,使用multiprocessing还是可以的 import jieba import jieba ...

  6. Redis持久化技术浅析

    Redis是一种内存数据库,数据都存储在内存中,因此可以快速地直接基于内存中的数据结构进行高性能的操作,但是所有数据都在内存中,一旦服务器宕机,内存中的数据就会全部丢失,数据将无法恢复,因此Redis ...

  7. 最简编译CockroachDB 21.2

    编译CockroachDB比较麻烦,尤其是从git下载代码编译还需要关联项目的下载,本文整理从官网下载代码的编译过程,非常简单,几乎没有异常,供大家参考. 编译CockroachDB 21.2 1.安 ...

  8. 鸿蒙HarmonyOS实战-ArkUI动画(弹簧曲线动画)

    前言 弹簧曲线动画是一种模拟弹簧运动的动画效果,通过改变弹簧的拉伸或压缩来表现不同的运动状态.以下是制作弹簧曲线动画的步骤: 创建一个弹簧的模型,可以使用圆形或者曲线来代表弹簧的形状. 将弹簧固定在一 ...

  9. WPF 推荐一个剪贴板内容查看工具

    本文来安利大家一个好用的 Windows 剪贴板的内容查看工具 这是在 GitHub 上完全免费开源的应用,由 walterlv 开发的应用,详细请看 https://github.com/walte ...

  10. .NET Emit 入门教程:第七部分:实战项目1:将 DbDataReader 转实体

    前言: 经过前面几个部分学习,相信学过的同学已经能够掌握 .NET Emit 这种中间语言,并能使得它来编写一些应用,以提高程序的性能. 随着 IL 指令篇的结束,本系列也已经接近尾声,在这接近结束的 ...