如何检查其他程序是否在全屏模式下运行,例如媒体播放器。

5

如何在C++ MFC中检查其他应用程序是否以全屏模式和最高优先级运行?

如果媒体播放器或其他播放器正在运行,我只想禁用所有自动对话框(警告)。 (就像Avast中的静默/游戏模式一样。)

我该怎么做呢?

谢谢。

2个回答

8

使用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 );

编辑2:更新已测试的代码,适用于Windows 7上的MediaPlayer。我尝试使用GetForeGroundWindow替代EnumWindows,但是IsFullScreenSize()检查根据鼠标在媒体播放器的哪个区域而定。

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


那么我必须忘记你的示例代码,集中精力于这些新功能上? - TlMPEER
根据您想要的行为,有一些注意事项:假设是双显示器系统,一个应用程序可以在屏幕1上全屏显示,但这并不意味着它也具有焦点,因为用户同时可以在屏幕2上使用另一个应用程序。因此,在这种情况下,您必须决定要做什么。 - stijn
IsFullscreenAndMaximized函数为什么总是返回TRUE? - TlMPEER
好的,谢谢!快完成了。如果我打开任务管理器并将其最大化,该功能就可以正常工作,但是如果我打开媒体播放器并将其全屏,它就无法正常工作。只有当我将其最大化,然后将其设置为全屏时才有效。我应该只关注WS_EX_TOPMOST吗? - TlMPEER
这难道不只是与主屏幕进行比较吗?如果引入另一个分辨率不同的监视器,我看不出这将如何检查。要进行更彻底的比较,您需要与HWND所在的监视器进行比较。 - Built on Sin
@BuiltonSin 是的,正如答案和评论中所说的那样,在多个显示器设置上可能无法按预期工作。 - stijn

0

在我看来,这只是一个微小的改进。

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

多显示器设置怎么办?如何区分已调整大小以覆盖整个屏幕的窗口和真正全屏模式的窗口?您确认最大化窗口的窗口矩形确实与桌面的窗口矩形相同了吗? - IInspectable
注意:在AreSameRECT中,(lhs.left == lhs.left)应该是(lhs.left == rhs.left)。 - msoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接