首页 > 编程语言 >C# 多显示器窗口控制详解

C# 多显示器窗口控制详解

时间:2024-07-10 19:08:55浏览次数:17  
标签:WorkingArea 设定 窗口 AllScreens C# Screen 显示器 详解

写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

作者: SamHou

文章链接: https://blog.samhou.top/Winform%20Csharp%E5%A4%9A%E6%98%BE%E7%A4%BA%E5%99%A8%E7%AA%97%E5%8F%A3%E6%8E%A7%E5%88%B6%E8%AF%A6%E8%A7%A3/

版权声明:本博客所有内容禁止转载,所有发布平台在about页列出。如引用博客内容,请注明出处!

标签:WorkingArea,设定,窗口,AllScreens,C#,Screen,显示器,详解
From: https://www.cnblogs.com/east115/p/18294827

相关文章

  • 升级之道:精通Conda的自我升级艺术
    升级之道:精通Conda的自我升级艺术引言Conda是Python和其他科学计算语言的强大包管理器,它不仅管理着包的安装和依赖,还负责自身的更新。随着开源社区的不断发展,Conda定期发布新版本以修复已知问题、增加新功能和提高性能。本文将详细介绍如何在Conda中使用condaupgrade命令......
  • 【VMware vCenter】VMware vCenter Server(VCSA) 5.5 版本证书过期问题处理过程。
    之前帮客户处理了一个因证书过期导致vCenterServer无法登录的问题,在此记录一下,因为时间过去有点久了,可能会有些地方描述的不是很清楚,所以就当作参考就行。客户环境是一个非常老的vCenterServer5.5版本并基于Linux版本的VCSA(当时这个版本还有基于Windows的,注意区别),早......
  • 【ROS2】中级-编写动作服务器和客户端(C++)
    目标:用C++实现一个动作服务器和客户端。教程级别:中级 时间:15分钟 目录 背景 先决条件 任务1.创建custom_action_cpp包2.编写动作服务器3.编写动作客户端 摘要 相关内容 背景动作是ROS中异步通信的一种形式。动作客户端向动作服务器发送目标请求。动作......
  • C++中各类常用算法的总结以及使用
    1.常用算法文章目录1.常用算法1.常用遍历算法1.for_each2.transform2.常用查找算法1.find2.find_if3.adjacent_find4.binary_search5.count6.count_if3.常用排序算法1.sort2.random_shuffle3.merge4.reverse4.常用拷贝和替换算法1.copy2.replace3.repla......
  • Oracle 使用append对insert大批量数据进行优化
    append介绍/+append/1、概念:append属于directinsert,归档模式下appendtablenologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo。2、优势:使用append,一是减少对空间的搜索;二是有可能减少redolog的产生。所以append方式会快很多,一......
  • Franka Robot 夹爪控制示例(grasp_object.cpp)
    //Copyright(c)2023FrankaRoboticsGmbH//UseofthissourcecodeisgovernedbytheApache-2.0license,seeLICENSE#include<iostream>#include<sstream>#include<string>#include<thread>#include<franka/exception.h>......
  • Cilium Socket LB 特性
    CiliumSocketLB一、环境信息主机IPubuntu172.16.94.141软件版本docker26.1.4helmv3.15.0-rc.2kind0.18.0kubernetes1.23.4ubuntuosUbuntu20.04.6LTSkernel5.11.5内核升级文档二、CiliumSocketLB模式认知负载均衡的实......
  • CAD Exchanger SDK 3.24.0 终极版-say goodbye
    随着今年即将结束,还有一件重要的事情——CADExchanger3.24.0的发布。此次最新更新带来了一系列虽小但仍然值得注意的改进。其中包括ManufacturingToolkit(MTK)和Unity增强功能、Lab和VisualizationToolkit中模型部件检测的改进以及WebToolkit(WTK)中的修复。......
  • ABB FS450R17KE3/AGDR-72CS
    ABB提供了一系列模块化产品和解决方案,旨在满足工业自动化和控制系统的多样化需求。这些模块涵盖了从传动系统、机器人技术、电源模块到端子模块等多个方面,为各种应用提供了灵活、高效的解决方案。ABB的传动模块,如ACS880和ACS860,是专门为工业应用设计的,提供了高可......
  • 西门子主板G85139-E1721-C880-C板
    功率单元板件介绍单元电源板板件作用:从功率单元直流母线上取电,输出24V直流电源供单元控制板使用。板件接口:输入接口:接功率单元正、负直流母线输出接口:24VDC输出,接单元控制板单元控制板板件作用:1)接收主控系统信号,给驱动板提供控制信号;2)进行实时故障监测,向主控系统上报故障信......