views:

53

answers:

2

Hi,

How can I check if an other app is running in full screen mode & topmost in c++ MFC? I just want to disable all of my auto dialogs (warnings) if media player or other players are running. (Like silent/gamer mode in Avast.) How could I do that?

Thank you.

+2  A: 

using a combination of EnumWindows, GetWindowInfo and GetWindowRect does the trick.

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: updated with tested code, which works fine here for MediaPlayer on Windows 7. I tried with GetForeGroundWindow instead of the EnumWindows, but then the IsFullScreenSize() check only works depending on which area of media player the mouse is in exactly.

Note that the problem with multimonitor setups mentioned in the comment below is still here.

stijn
So I have to forget your sample code, and should concentrate to these new functions?
TlMPEER
depends on what behaviour you want, there are some caveats: suppose a dual monitor system, an app can be fullscreen on screen 1, but that does not necessarily mean it also has focus since the user can be using another app on screen 2 at the same time. So you have to decide what to do in that case as well..
stijn
The IsFullscreenAndMaximized function returns always TRUE, why?
TlMPEER
stijn
Ok, thank you! It's almost done. If I open the Task manager and I maximize it, the function works, but if I open a media player and make it to full screen, it doesn't work. Only if I maximize it and then I make it to full screen. Should I only focus to the WS_EX_TOPMOST ?
TlMPEER
see update for working code
stijn
Thank you very much for your help. You are great!
TlMPEER
A: 

I tried to use this in a timer:

HWND hwnd = ::GetTopWindow(NULL);
WINDOWINFO info;
::GetWindowInfo( hwnd, &info ); 
if(info.dwExStyle & WS_EX_TOPMOST && info.dwStyle & WS_MAXIMIZE){
MessageBox(L"FULL!");

But it only alerts when I open the task manager and maximize it. How can I detect a full screened media player?

TlMPEER