Как проверить, если мое окно скрыто / видно? - PullRequest
3 голосов
/ 07 июня 2011

Если я нажму кнопку «показать рабочий стол» в 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;
}

Ответы [ 4 ]

4 голосов
/ 07 июня 2011

WM_ACTIVATE отправляется, когда другое окно становится активным.Когда вы говорите «Показать рабочий стол», никакое другое окно не становится активным, так что технически ваше приложение все еще активно, даже если оно было свернуто.

Возможно, вы захотите посмотреть WM_WINDOWPOSCHANGED .Вы можете посмотреть на флаги, чтобы увидеть тип события положения, или вы можете проверить IsIconic и IsWindowVisible всякий раз, когда изменяется положение окна.

2 голосов
/ 07 июня 2011

Существует множество потенциальных функций, которые могут дать вам необходимую информацию в зависимости от того, что именно вы хотите сделать:

  • GetForegroundWindow () : получает окноПользователь в настоящее время "работает" с.Вы можете использовать это, если хотите рисовать только когда пользователь использует ваше приложение, но не другое.
  • GetActiveWindow () : Возвращает активное окно в вызывающем потоке, которое, вероятно,не то, что вы хотите.Это может быть полезно, если вы хотите включить / отключить рисование в зависимости от того, какое окно было активным в вашем собственном приложении.
  • GetFocus () : Возвращает окно с текущим фокусом клавиатуры в вызовенить.Возможно, это не то, что вам нужно, и используйте вместо этого GetForegorundWindow ().
  • IsWindowVisible () : Возвращает, установлен ли флаг отображения / скрытия окна в видимое состояние.На самом деле это не говорит о том, действительно ли окно действительно видно на экране.
  • GetTopWindow () : сообщает вам самое высокое окно в z-порядке, но не имеет ли оно на самом делефокус / передний план.Возможно, ваше окно может быть сфокусировано / активировано / передним планом, но не иметь самый высокий z-порядок (я думаю, в любом случае).

Однако из ваших комментариев вы, похоже, действительно хотите видетьесли на экране виден хотя бы один пиксель вашего окна.Для этого я бы, вероятно, использовал метод, упомянутый в этом вопросе SO с использованием странно названного GetRandomRgn () , хотя более простой проверкой может быть использование GetClipBox () ипроверьте код возврата для NULLREGION.

0 голосов
/ 07 июня 2011

Попробуйте WM_ACTIVATEAPP.

wParam будет false, если окно из любого другого приложения получает фокус.Это включает нажатие кнопки «показать рабочий стол».

0 голосов
/ 07 июня 2011

IsWindowVisible сообщает вам, является ли ваше окно видимым.GetTopWindow сообщает вам, является ли оно самым верхним в Z-порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...