更改分辨率时如何保留其他应用程序窗口大小和位置? (例如,以非桌面分辨率进出全屏游戏)

时间:2009-03-26 13:31:13

标签: windows opengl direct3d

有没有人注意到在Windows中全屏显示时使用D3D或OpenGL的应用程序的奇怪行为?它仅适用于应用程序全屏显示然后切换回窗口或终止的情况。它们可以随机播放其他应用程序的窗口位置(当我在单台监视器上时),或者当我在多台监视器上时,将所有其他应用程序窗口移动到另一个屏幕。

如果没有显示这两个异常的应用程序,我会认为这是理所当然的。那么,我的问题是,在编写应用程序以缓解这两个问题时,需要注意什么呢?另外,我不确定除Windows之外的其他平台上是否存在此问题?

我对此的主要设置是OpenGL / C ++,但我认为这适用于您所拥有的任何设置,因为它似乎是需要处理的平台API事项。


编辑:好的,这里有一些关于我的观察的更多说明。即使在与桌面分辨率相同的分辨率下问题仍然存在因此,它似乎与分辨率切换没有关系,因为我已经看到应用程序/游戏,即使它们与桌面的分辨率不同,当它们切换回来时,桌面上的窗口也会像之前一样恢复。全屏应用程序已运行。


edit2 :它看起来像是一个分辨率切换问题,Windows(至少XP)似乎不记得应用程序窗口的位置和大小(在多个显示器设置的情况下)。看起来只有解决方案是我在问题的答案中提供的解决方案 - 即使它似乎是OS应该提供的东西,至少作为一个或两个API调用。我仍然不相信这是唯一的解决方案,必须有一种简单方便的优雅,轻松的恢复,不是吗?

3 个答案:

答案 0 :(得分:2)

你不应该使用ChangedDisplaySettingsEx(..., CDS_FULLSCREEN, NULL)吗?这将告诉系统解决方案交换是暂时的。

答案 1 :(得分:1)

我不能说我对你遇到的情况100%肯定。但是,我的猜测是因为大多数D3D / OpenGL游戏在出于性能原因启动/关闭时会改变机器的分辨率。

您看到的那些不会改变窗口周围的窗口可能不会改变分辨率,因为它们可能能够以您当前的设置运行。

答案 2 :(得分:0)

嗯,我已经对此进行了更多的研究 - 看起来在更改分辨率后恢复所有正在运行的窗口大小和位置没有默认回退,因此必须在应用程序内完成(至少在XP中)。

因此,为了优雅地从其他分辨率(例如全屏游戏)返回,我需要使用EnumWindows获取所有正在运行的应用程序,并使用适当的回调并通过列表中的GetWindowRect存储每个窗口RECT结构。

当切换回桌面分辨率时,我会再次使用EnumWindows,但使用不同的回调,使用SetWindowPos设置每个正在运行的应用程序窗口的位置和大小,使用我在切换到全屏之前保存的RECT列表。

有一些问题,就像看着你只通过EnumWindows等获得一个窗口一样。看起来奇怪的是OS没有提供这样的功能,即使只有API。我想知道其他操作系统如何处理它,如果他们处理它。