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

Roo*_*kie 3 c++ opengl winapi visual-studio-2008

如果我在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*thy 5

当另一个窗口变为活动状态时,发送WM_ACTIVATE。当您说“显示桌面”时,没有其他窗口处于活动状态,因此从技术上讲,即使已将其最小化,您的应用程序仍处于活动状态。

您可能要注意WM_WINDOWPOSCHANGED。您可以查看标志以查看它是什么类型的位置事件,或者只要窗口位置发生更改,就可以检查IsIconicIsWindowVisible


ues*_*esp 5

有多种潜在功能可以为您提供所需的信息,具体取决于您想要执行的操作:

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

然而,从您的评论来看,您似乎实际上想查看窗口中是否至少有一个像素在屏幕上实际可见。为此,我可能会使用这个SO问题中提到的技术,使用奇怪命名的GetRandomRgn(),尽管更简单的检查可能是使用GetClipBox()并检查NULLREGION.