65.9K
CodeProject 正在变化。 阅读更多。
Home

在多显示器系统上重新定位窗口

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.20/5 (6投票s)

2007 年 7 月 24 日

CPOL

2分钟阅读

viewsIcon

47368

downloadIcon

1755

如何在多显示器系统上重新定位窗口。

引言

在具有多个显示器的系统上,由于像

SystemParametersInfo( SPI_GETWORKAREA, 0, &rc, 0 );//only primary Monitor

这里有一个双显示器的可能设置:左侧 (1) 是标准显示器,右侧 (2) 是扩展显示器,例如用于不太重要的信息,如帮助、电子邮件或浏览。

Screenshot - Multiscreen.jpg

背景

上周,我遇到了一个在具有多个显示器的计算机上恢复窗口的问题。我找了一些示例,但没有找到好的示例,所以我编写了一些代码来解决这个问题。并且,我想展示我的新知识并在此处发布它。

但还有其他可能的设置;例如,将右侧显示器设置为主要显示器可能会看起来很奇怪。这意味着左侧显示器的坐标具有负值。

Screenshot - Multiscreen2.jpg

任务栏

任务栏也需要一些空间,因此最好不要使用该区域来显示窗口。任务栏可以有不同的位置。这从标准位置 (1) 到三个不同的位置 (2)-(4) 进行了说明。

Screenshot - Multiscreen_with_Taskbar.jpg

使用代码

我将所有有趣的代码打包到一个设计的类中,以便集中代码并易于使用。由于 #define COMPILE_MULTIMON_STUBS,您需要注意如何使用该类。如果您发现更好的方法,请告诉我。

现在我编写了一个全局对象,因此您不需要额外的对象,并且如果您在项目中包含这些文件,该对象可用。

//Fetch informations
int cnt ) gMonitor.GetCount(); 
int iMonitor = gMonitor.GetPrimary();

//test for repositioning
CRect rc;
GetWindowRect( rc );

iMonitor = gMonitor.GetNearestDisplay( rc ); //also overloaded for point

if( !gMonitor.EnsureInMonitor( rc, iMonitor ) )
    MoveWindow( rc );

关注点

这段代码可以帮助您在多显示器系统上获得更好的用户体验,因为如果窗口无法适应单个物理屏幕,它将被移动。

这变得非常棘手。当主显示器是右侧(或上方?)时,左侧(顶部)具有负值,并且调整大小需要额外的代码行。

另外,注意任务栏区域,这是另一个陷阱。

历史

  • 初始发布:2007 年 7 月 24 日。
  • 更新:2007 年 8 月 7 日:包含图片和工作区扩展。
© . All rights reserved.