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
不包括任务栏,所以高度较少,这两种需要看情况使用。
参考资料
作者: SamHou
版权声明:本博客所有内容禁止转载,所有发布平台在about页列出。如引用博客内容,请注明出处!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!