0

当他们在 Windows 中全屏显示时,有没有人注意到使用 D3D 或 OpenGL 的应用程序的这种奇怪行为?它仅适用于应用程序进入全屏然后切换回窗口或终止时。他们要么洗牌其他应用程序的窗口位置(当我在单显示器机器上),或者当我在多显示器机器上时将所有其他应用程序窗口移动到另一个屏幕。

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

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


编辑:好的,这是对我的观察的更多说明。即使在与桌面相同的分辨率下,问题仍然存在。因此,它似乎与分辨率切换无关,因为我见过应用程序/游戏,即使它们与桌面的分辨率不同,当它们切换回来时,桌面上的窗口也会恢复到以前的状态全屏应用程序已运行。


edit2:看起来这是一个分辨率开关问题,Windows(至少是 XP)似乎不记得应用程序窗口的位置和大小(在多显示器设置的情况下)。看起来唯一的解决方案是我在对问题的回答中提供的解决方案——即使它看起来像是操作系统应该提供的东西,至少作为一个或两个 API 调用。我仍然不相信这是唯一的解决方案,一定有一种简单的方法可以优雅、轻松地恢复,不是吗?

4

3 回答 3

2

Shouldn't you be using ChangedDisplaySettingsEx(..., CDS_FULLSCREEN, NULL)? That will tell the system the resolution swap is temporary.

于 2009-03-27T01:28:23.033 回答
1

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

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

于 2009-03-26T13:36:36.830 回答
0

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

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

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

当然,也有一些问题,比如只能通过 EnumWindows 等看到你获得一个窗口 hwnd。操作系统不提供这样的功能似乎很奇怪,即使只有 API。我想知道其他操作系统如何处理这个问题,如果他们处理它的话。

于 2009-03-26T16:56:54.150 回答