Winform C#多显示器窗口控制详解
写Winform程序的时候,有将一个窗口放置到特定的显示器,并且全屏的需求。于是借此机会,好好研究了一番这个Screen类[1],总结了一些方法。
Windows的窗口逻辑
首先我们需要知道窗口定位的逻辑。以2个窗口为例,下面的图片展示了显示器和坐标的对应关系。注意,使用深色模式可能看不清,可以点击上方的切换按钮切换为浅色。

可以看到,连接多个显示器后,每个显示器的每个点都有一个唯一的坐标。我们要做的,就是把Form的坐标设置到显示器上面去。
获取显示器列表
首先确保引用了using System.Windows.Forms;,这样才有Screen类可以用。
文档指出,可以用Screen.AllScreens获取所有显示器的数组。那么这个里面有什么呢?我们来看看文档是怎么说的:
Property Value
Screen[]
An array of type Screen, containing all displays on the system.
也就是说,返回的数组是个Screen数组。数组里面每一个元素都是个Screen对象,分别对应用户的每个显示设备。因此,我们可以通过这些对象来访问每个显示器。比如:
Screen scr1=Screen.AllScreens[0] //获取第1个显示器
Screen scr2=Screen.AllScreens[1]//第二个显示器
设置窗口位置
为了设定窗口位置,我们需要知道一个显示器左上角对应的坐标,这样才可以把窗口放进去。
比如,以下代码可以设置Form位置为第2个显示器的左上角,然后设置窗口覆盖全屏幕(包括任务栏:
Location = Screen.AllScreens[1].Bounds.Location;//设定目标坐标,结合上面的图片,这里是(1920,28)
Width = Screen.AllScreens[1].Bounds.Width;//设定窗口的宽度
Height = Screen.AllScreens[1].Bounds.Height;//设定窗口高度
但大部分情况下,我们只需要覆盖任务栏之上的部分,因此稍作修改:
Location = Screen.AllScreens[1].WorkingArea.Location;//设定目标显示器
Width = Screen.AllScreens[1].WorkingArea.Width;//设定窗口的宽度
Height = Screen.AllScreens[1].WorkingArea.Height;//设定窗口高度
注意到了吗?这里我们用的是WorkingArea来获取长宽高,以及位置。WorkingArea不包括任务栏,所以高度较少,这两种需要看情况使用。
参考资料
[1] System.Windows.Forms.Screen
Winform C#多显示器窗口控制详解的更多相关文章
- 第15.34节 PyQt(Python+Qt)入门学习:containers容器类部件QStackedWidget堆叠窗口部件详解
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 StackedWidget堆叠窗口部件为一系列窗口部件的堆叠,对应类为QStackedWi ...
- 利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解
本文转载自利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解 导语 由于最近工作需要利用 Jenkins 远程 API 操作 Jenkins 来完成一些列操作,就抽空研究 ...
- Odoo权限控制详解
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826105.html 一:Odoo中的权限设置主要有以下5种 1)菜单.报表的访问权限 Odoo可以设置菜 ...
- 面试之路(29)-TCP流量控制和拥塞控制-滑动窗口协议详解
拥塞: 拥塞发生的主要原因在于网络能够提供的资源不足以满足用户的需求,这些资源包括缓存空间.链路带宽容量和中间节点的处理能力.由于互联网的设计机制导致其缺乏"接纳控制"能力,因此在 ...
- Qt多窗口编程详解
常用的窗体基类是 QWidget.QDialog 和 QMainWindow,在创建 GUI 应用程序时选择窗体基类就是从这 3 个类中选择. QWidget 直接继承于 QObject,是 QDia ...
- TCP之四:TCP 滑动窗口协议 详解
滑动窗口机制 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口:同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口.发送窗口和接收窗口的序号的 ...
- js键盘事件全面控制详解
js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件 ...
- PHP flush sleep 输出缓存控制详解
1 2 3 4 5 6 ob_start,flush,ob_flush for($i=0;$i<</SPAN>10;$i++) { echo $i.''; flush(); slee ...
- js键盘事件全面控制详解【转】
js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型 ...
- C 语言 printf格式控制详解
闲来无事,整理了一下C语言printf() 的格式控制语句. PS:详细来源于网络. printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说 ...
随机推荐
- GridControl 给选中的行添加边框显示
实现方式,通过自定义 RowControl 的样式实现. 参考:https://supportcenter.devexpress.com/ticket/list?searchString=RowCel ...
- Thor: 统一AI模型网关的革新之选
Thor: 统一AI模型网关的革新之选 项目价值 Thor(雷神托尔)作为一个强大的AI模型管理网关,解决了当前AI领域一个关键痛点:不同AI服务商的API格式各异,集成成本高.Thor通过将各种AI ...
- SpringBoot 自动代码生成三层
前言 虽然mybatis已经有了代码生成,但是对于SpringBoot 项目来说生成的还是需要改动,而且也没得逻辑层,和控制层.但是这些东西是逃避不了,所以我就针对单表,做了一个代码生成器. my ...
- .NET Core 中如何实现缓存的预热?
在构建高性能的 .NET Core 应用时,缓存是提升系统响应速度.减轻数据库压力的利器.然而,缓存并非一蹴而就,它也需要"热身"才能发挥最佳性能.这就是缓存预热的意义所在. 一. ...
- 使用PySide6/PyQt6实现Python跨平台通用列表页面的基类设计
我在随笔<使用PySide6/PyQt6实现Python跨平台GUI框架的开发>中介绍过PySide6/PyQt6 框架架构的整体设计,本篇随笔继续深入探讨框架的设计开发工作,主要针对通用 ...
- Go语言fmt.Sprintf、fmt.Printf(格式化输出)
fmt.Printf fmt.Printf在程序中使用%f来格式化所需的值 看起来我们的值被四舍五入到了一个合理的数.但小数点后仍显示了6位,这对我们当前的需要来说实在是太多了. 对于这种情况,格式化 ...
- 【Vue3】下载zip文件损坏的问题
需求: 需要在vue3上实现Asp.net Web API 下载zip包的功能,本身需求很简单,但是中间遇到了问题,记录一下. 问题: 下载的zip包和后端的zip包大小不一致,后端生成的zip 61 ...
- BUUCTF---古典密码知多少
题目 知识 一共给出四种古典密码,分别是:猪圈密码.圣堂武士密码.标准银河字母.栅栏密码 猪圈之前有介绍 圣: 标准银河字母 更多加密方式 解题 对照解密 FGCPFLIRTUASYON 再使用栅栏 ...
- Windows Terminal 添加 git-bash
配置文件中 profiles 节点补充配置 { "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b7}", " ...
- Go 中 JSON 的序列化和反序列化
golang中对json的序列化/反序列化操作还是比较容易的, 序列化操作主要是通过encoding/json包的Marshal()方法来实现, 反序列化操作主要是通过encoding/json包的U ...