Как проверить, работает ли другая программа в полноэкранном режиме, например. медиаплеер - PullRequest
4 голосов
/ 26 сентября 2010

Как я могу проверить, работает ли другое приложение в полноэкранном режиме и самое верхнее в C ++ MFC? Я просто хочу отключить все мои автоматические диалоги (предупреждения), если медиаплеер или другие плееры запущены. (Как в режиме безмолвия / игры в Avast.) Как я мог это сделать?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 26 сентября 2010

с использованием комбинации EnumWindows, GetWindowInfo и GetWindowRect делает свое дело.

bool IsTopMost( HWND hwnd )
{
  WINDOWINFO info;
  GetWindowInfo( hwnd, &info );
  return ( info.dwExStyle & WS_EX_TOPMOST ) ? true : false;
}

bool IsFullScreenSize( HWND hwnd, const int cx, const int cy )
{
  RECT r;
  ::GetWindowRect( hwnd, &r );
  return r.right - r.left == cx && r.bottom - r.top == cy;
}

bool IsFullscreenAndMaximized( HWND hwnd )
{
  if( IsTopMost( hwnd ) )
  {
    const int cx = GetSystemMetrics( SM_CXSCREEN );
    const int cy = GetSystemMetrics( SM_CYSCREEN );
    if( IsFullScreenSize( hwnd, cx, cy ) )
      return true;
  }
  return false;
}

BOOL CALLBACK CheckMaximized( HWND hwnd, LPARAM lParam )
{
  if( IsFullscreenAndMaximized( hwnd ) )
  {
    * (bool*) lParam = true;
    return FALSE; //there can be only one so quit here
  }
  return TRUE;
}

bool bThereIsAFullscreenWin = false;
EnumWindows( (WNDENUMPROC) CheckMaximized, (LPARAM) &bThereIsAFullscreenWin );

edit2: обновлен с проверенным кодом, который отлично работает здесь для MediaPlayer на Windows 7. Я пробовал использовать GetForeGroundWindow вместо EnumWindows, но тогда проверка IsFullScreenSize () работает только в зависимости от того, в какой именно области медиаплеера находится мышь.

Обратите внимание, что проблема с настройками для нескольких мониторов, упомянутая в комментарии ниже, все еще здесь.

0 голосов
/ 12 августа 2013

по моему мнению очень небольшое улучшение

bool AreSameRECT (RECT& lhs, RECT& rhs){
    return (lhs.bottom == rhs.bottom && lhs.left == lhs.left && lhs.right == rhs.right && lhs.top == rhs.top) ? true : false;
}


bool IsFullscreenAndMaximized(HWND hWnd)
{
    RECT screen_bounds;
    GetWindowRect(GetDesktopWindow(), &screen_bounds);

    RECT app_bounds;
    GetWindowRect(hWnd, &app_bounds);

    if(hWnd != GetDesktopWindow() && hWnd != GetShellWindow()) {
        return AreSameRECT(app_bounds, screen_bounds);
    }

    return false;
}

И благодаря личному ответу

BOOL CALLBACK CheckFullScreenMode ( HWND hwnd, LPARAM lParam )
{
    if( IsFullscreenAndMaximized(GetForegroundWindow()) )
    {
        * (bool*) lParam = true;
        std::cout << "true";

        return FALSE; 
    }
    return TRUE;
}


int main() {

    bool bThereIsAFullscreenWin = false;
    EnumWindows( (WNDENUMPROC) CheckFullScreenMode, (LPARAM) &bThereIsAFullscreenWin );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...