【问题标题】:How to check if an other program is running in fullscreen mode, eg. a media player如何检查其他程序是否以全屏模式运行,例如。媒体播放器
【发布时间】:2011-04-17 09:39:58
【问题描述】:

如何检查其他应用程序是否在 C++ MFC 中以全屏模式和最顶层模式运行? 如果媒体播放器或其他播放器正在运行,我只想禁用所有自动对话框(警告)。 (就像 Avast 中的静音/游戏模式。) 我怎么能这样做?

谢谢。

【问题讨论】:

    标签: c++ mfc dialog fullscreen


    【解决方案1】:

    在我看来,进步很小

    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 );
    }
    

    【讨论】:

    • 多显示器设置怎么样?您如何区分已调整大小以覆盖整个显示器的窗口和真正处于全屏模式的窗口?你验证过最大化窗口的窗口矩形真的和桌面的窗口矩形一样吗?
    • 注意:(lhs.left == lhs.left) 在 AreSameRECT 中应该是 (lhs.left == rhs.left)
    【解决方案2】:

    使用 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:使用经过测试的代码进行了更新,在 Windows 7 上的 MediaPlayer 中运行良好。我尝试使用 GetForeGroundWindow 而不是 EnumWindows,但随后 IsFullScreenSize() 检查仅根据鼠标所在的媒体播放器区域起作用.

    请注意,下面评论中提到的多显示器设置问题仍然存在。

    【讨论】:

    • 所以我不得不忘记你的示例代码,而应该专注于这些新功能?
    • 取决于你想要什么行为,有一些注意事项:假设一个双显示器系统,一个应用程序可以在屏幕 1 上全屏,但这并不一定意味着它也有焦点,因为用户可以同时在屏幕 2 上使用另一个应用程序。所以你也必须决定在这种情况下该怎么做..
    • IsFullscreenAndMaximized 函数总是返回 TRUE,为什么?
    • 好的,谢谢!快完成了。如果我打开任务管理器并将其最大化,则该功能有效,但如果我打开媒体播放器并将其设为全屏,则该功能无效。只有当我最大化它然后我把它变成全屏时。我应该只关注 WS_EX_TOPMOST 吗?
    • 非常感谢您的帮助。你太棒了!
    猜你喜欢
    • 1970-01-01
    • 2012-09-22
    • 2015-01-31
    • 2011-10-31
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多