Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查我的窗口是否隐藏/可见?_C++_Visual Studio 2008_Winapi_Opengl - Fatal编程技术网

C++ 如何检查我的窗口是否隐藏/可见?

C++ 如何检查我的窗口是否隐藏/可见?,c++,visual-studio-2008,winapi,opengl,C++,Visual Studio 2008,Winapi,Opengl,如果我在Windows7中按“显示桌面”按钮,我的程序仍然会认为它没有最小化,如果我在程序聚焦时按WIN+D,只有这样我的程序才会捕获这个最小化命令。我怎样才能100%确定我的程序是否可见 这是我的主要循环: while(!done){ if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ if(msg.message == WM_QUIT){ done = TRUE; }else{

如果我在Windows7中按“显示桌面”按钮,我的程序仍然会认为它没有最小化,如果我在程序聚焦时按
WIN+D
,只有这样我的程序才会捕获这个最小化命令。我怎样才能100%确定我的程序是否可见

这是我的主要循环:

while(!done){
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
        if(msg.message == WM_QUIT){
            done = TRUE;
        }else{
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }else if(active){
        render();
    }
}
Edit3:这样好吗?看起来它在工作:

case WM_WINDOWPOSCHANGED:
{
        flags = ((PWINDOWPOS)lParam)->flags;
        if((flags & 0x8000) && (flags & SWP_NOCOPYBITS) && (flags & SWP_FRAMECHANGED)){
            active = !(flags & SWP_NOACTIVATE);
        }
        if((flags & 0x1000) && (flags & 0x0800) && (flags & SWP_NOMOVE) && (flags & SWP_NOSIZE)){
            active = 1;
        }
}
case WM_ACTIVATE:
{
    active = !HIWORD(wParam);
    return 0;
}

IsWindowVisible告诉您窗口是否可见。GetTopWindow告诉您它是否是Z顺序中最上面的一个。当另一个窗口变为活动时,会发送WM_ACTIVATE。当你说“显示桌面”时,没有其他窗口处于活动状态,所以从技术上讲,你的应用程序仍然处于活动状态,即使它已最小化

你可能想注意一下。您可以查看标志以查看它是什么类型的位置事件,也可以在窗口位置更改时进行检查。

尝试WM_ACTIVATEAPP


如果来自任何其他应用程序的窗口获得焦点,wParam将为false。这包括按下“显示桌面”按钮。

根据您的具体操作,有多种可能的功能可为您获取所需信息:

  • :获取用户当前正在“使用”的窗口。如果您只想在用户使用您的应用程序而不是另一个应用程序时绘制东西,则可以使用此选项
  • :返回调用线程中的活动窗口,该窗口可能不是您想要的。如果希望根据自己的应用程序中处于活动状态的窗口启用/禁用绘图,这可能会很有用
  • :返回调用线程中具有当前键盘焦点的窗口。可能不是您想要的,而是使用GetForegorundWindow()
  • :返回窗口的显示/隐藏标志是否设置为可见。这实际上并不能告诉您窗口在屏幕上是否实际可见
  • :告诉您z顺序中的最高窗口,但不告诉您它是否实际具有焦点/前景。您的窗口可能会聚焦/激活/前景,但没有最高的z顺序(我想无论如何)

然而,从你的评论来看,你似乎真的想看看你的窗口在屏幕上是否至少有一个像素是可见的。为此,我可能会使用在使用奇怪名称中提到的技术,尽管一个更简单的检查可能是在Windows 8/10中使用并检查
NULLREGION

的返回代码,但还有另一个与IsWindowVisible分开的窗口可见性标志。检查DwmGetWindowAttribute和DWMWA_掩蔽属性


此外,窗口可以是半透明的,GetLayeredWindowAttributes可以告诉您窗口的alpha级别。

当您隐藏窗口时,什么在擦除内容?@Cody,问题是如果我按下“显示桌面”按钮,我的程序渲染循环将继续运行。。。因为它没有告诉我它被隐藏了。@Cody,我用openGL渲染,我不明白这和我的问题有什么关系。我特意添加了winapi标记:这应该与窗口消息处理有关。我怀疑我的程序是否与其他程序有那么大的不同,因为许多人只是像我一样复制粘贴nehe教程。所以请理解。如果你只是从网上“复制粘贴”了一些教程,难怪你会有问题。通读OpenGL红皮书,以便您真正了解您的程序的功能。@Rookie:这是一个很好的观点。你应该只看一次《这本书》,这样你就不必再浪费时间问更多的问题了。每次查找都是一件非常痛苦的事情。你知道一种不需要我时不时调用该函数的方法吗?就像我现在使用的
case WM\u ACTIVATE:
一样。更不用说我尝试了IsWindowVisible(),但它似乎也没有捕捉到
WIN+D
。(除非我的程序当前处于焦点状态)“GetTopWindow会告诉您它是否是Z顺序中最上面的一个。”-不是这样说的:“检查与指定父窗口关联的子窗口的Z顺序,并在Z顺序的顶部检索子窗口的句柄。”OP询问顶层窗口。但这意味着即使渲染窗口顶部只有一些小窗口,我也会停止渲染?我不想那样做。只有当它完全隐藏时,我才想停止渲染。它确实为您提供了一个连接到调用IsWindowVisible之类的函数的位置。实际上,我看不出有人提到过一个简单的WM_大小的消息。我刚刚检查了一下,当按下“show desktop”(显示桌面)时,我的应用程序会显示WM_大小。嗯,我认为这是正确的答案,但了解这些代码的实际含义会更有帮助(我收到的代码都不在你链接的网站上)。看看我发布的代码,如果有什么需要修复的话。WM_WINDOWPOSCHANGED消息(通过LPRAM)获取指向WINDOWPOS结构的指针。该结构的文档具有标志的含义。查看我发布的代码。。。我找到的代码都不在那页上。(或者我只是瞎了眼?)看起来我很愚蠢,但现在我知道怎么读了。0x1803是个谜;我在文档中根本找不到0x1000或0x0800。因此,我想使用我现有的代码可以吗?您可以跳过解码标志的尝试,每次出现此消息时只检查IsIconic和IsWindowVisible。这是一条不常出现的消息,因此您没有真正进行轮询,并且消息会在您关心的时间出现(当您的窗口变得隐藏或可见时)。知道是否有任何可见像素并不重要,只知道是否最小化了像素。WIN+D按钮和“显示桌面”按钮没有给出最小化消息。检查我最近编辑的代码,我现在正在使用。看看有没有改进的地方?啊,我明白了。
IsIconic()
函数应该为您提供