C ++如何使用处理程序检测窗口状态是不是在全屏?

Posted

技术标签:

【中文标题】C ++如何使用处理程序检测窗口状态是不是在全屏?【英文标题】:C++ How to detect the State of Window using handler whether its in Fullscreen or not?C ++如何使用处理程序检测窗口状态是否在全屏? 【发布时间】:2013-12-01 12:06:28 【问题描述】:

我需要确定应用程序(如游戏)窗口的状态,无论它是否全屏运行。

有没有类似window styles这样的WS_MAXIMIZE,WS_MINIMIZE来检查Window的Handler的全屏状态?

【问题讨论】:

使用 GetWindowPlacement(),showCmd 字段。我认为它可以在另一个进程拥有的窗口上调用,你会发现。当然,您不能指望它在通话后仍然准确。 【参考方案1】:

在 Windows 中,大多数应用程序没有真正的全屏窗口,它们只是填满整个屏幕,在某种程度上被称为“全屏”,但它们是普通的窗口。 问题是 Windows 没有标记或状态,尽管使用 D3D 是不同的,因为它可以在需要其他方法检测的真正全屏模式下运行。

判断它是否为全屏窗口的最佳方法是将窗口大小与显示器的大小进行比较。像 GetWindowRect (或 GetClientRect )来获取窗口的大小然后正确地做到这一点你需要知道窗口来自哪个显示器(如果有多个监视器)MonitorFromWindow 然后你可以查询监视器的大小GetMonitorInfo 以像素为单位(在MONITORINFO structure 中,您将获得屏幕的像素大小)。

现在您知道屏幕的大小和窗口的大小,这取决于您如何决定它是否是全屏的,您可以比较精确匹配或给它一些阈值并检查窗口的位置。

您还可以检查一个广泛使用的窗口标志 WS_EX_TOPMOST 它主要由 OpenGL 应用程序使用,以提供真正全屏应用程序的错觉,我会说如果窗口是 WS_EX_TOPMOST 并且它是尺寸与屏幕尺寸相同,您可以 90% 确定它是全屏游戏或类似的东西。 但是,关于如何检测 D3D 全屏应用,我真的无法给您任何建议。

【讨论】:

谢谢。正如您所提到的“在 Windows 中,大多数应用程序没有真正的全屏窗口,它们只会填满整个屏幕。在诸如游戏等应用程序以“真正”全屏模式运行的情况下,我无法获得该全屏应用程序的“句柄” . 我试过“GetDC”和“GetWindowDC”。它没有工作。请为此问题提供任何解决方案。 据我所知,这被称为覆盖模式,实际上是真正的全屏模式,我只能说你应该在 MSDN 上四处看看,尤其是在 Direct3D 中。因为据我所知,它是特定的。

以上是关于C ++如何使用处理程序检测窗口状态是不是在全屏?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 获取全屏窗口的设备上下文

如何使用 MFC 创建全屏窗口?

如何检测一个窗口已经被最大化?

如何使用C#锁定屏幕?

怎样在一个 C 程序中调用另一个程序 (独立可执行的程序, 或系统命令)?

如何用C语言检测网络是不是连接上、已连接、已断开状态