桌面应用常常会遇到多显示器适配问题,比如我们会期望让小人从最左边的屏幕跑到最右边,或者将一个窗口藏在所有显示器的显示区域之外。


在wpf中,我们我们有一个类叫做SystemParameters, 他提供了一些列系统相关的参数属性。

我们在这里需要注意的是两个系列

  • PrimaryScreen系列:包括PrimaryScreenHeightPrimaryScreenWidth

  • VirtualScreen系列:包括VirtualScreenHeightVirtualScreenTop,VirtualScreenLeftVirtualScreenTop

PrimaryScreen指的是系统的主屏幕。就是我们在显示设置中,确定的主显示器所显示的屏幕。

1542194346185

主屏幕的左上角点一定是(0,0),所有的其他显示器的显示屏幕坐标都是相对于主屏幕的坐标来确定的。

这也是为什么PrimaryScreen只提供了宽高的数据。

VirtualScreen指的是系统的虚拟屏幕。他是将所有的屏幕用最小的矩形包裹的区域。

如图中的蓝色虚线区域。

1542194846506

值得注意的是VirtualScreen的左上角点很可能处于不可显示区域。

这是处于各个显示器的分辨率,DPI不同,且多显示器也可能采用横排,竖排和九宫格方式进行布置。

不能简单的进行水平方向的对齐。

事实上,如果你使用截图软件对多屏幕进行截图,就可以发现VirtualScreen所存在的那些非显示区域

1542195163592

参考链接:

  • [The Virtual Screen Microsoft Docs](https://docs.microsoft.com/en-us/windows/desktop/gdi/the-virtual-screen)
  • [SystemParameters Class (System.Windows) Microsoft Docs](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.systemparameters?redirectedfrom=MSDN&view=netframework-4.7.2)

本文会经常更新,请阅读原文: https://huangtengxiao.gitee.io/post/window%E7%9A%84VirtualScreen.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://huangtengxiao.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系