2010-09-26 3 views

Répondre

8

en utilisant une combinaison de EnumWindows, GetWindowInfo et GetWindowRect fait l'affaire.

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: mis à jour avec le code testé, ce qui fonctionne très bien ici pour MediaPlayer sur Windows 7. J'ai essayé avec GetForegroundWindow au lieu des EnumWindows, mais la IsFullScreenSize() chèque ne fonctionne que selon le domaine du lecteur multimédia de la la souris est dans exactement.

Notez que le problème avec les configurations multimonitor mentionnées dans le commentaire ci-dessous est toujours là.

+0

donc je dois oublier votre exemple de code, et devrait se concentrer sur ces nouvelles fonctions? – TlMPEER

+0

dépend du comportement que vous voulez, il y a quelques mises en garde: Supposons un système à double moniteur, une application peut être en plein écran sur l'écran 1, mais cela ne signifie pas nécessairement que l'utilisateur peut utiliser une autre application sur l'écran 2 le même temps. Vous devez donc décider quoi faire dans ce cas également. – stijn

+0

La fonction IsFullscreenAndMaximized retourne toujours TRUE, pourquoi? – TlMPEER

0

dans mon oppinion très peu d'amélioration

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

Et grâce à priviose réponse

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

Qu'en est-il des configurations multi-moniteurs? Comment faire la distinction entre une fenêtre qui a été redimensionnée pour couvrir un affichage entier et une fenêtre qui est vraiment en mode plein écran? Avez-vous vérifié que le rectangle de la fenêtre d'une fenêtre agrandie est vraiment le même que le rectangle de la fenêtre du bureau? – IInspectable

+0

Note: (lhs.left == lhs.left) doit être (lhs.left == rhs.left) dans AreSameRECT – msoft

Questions connexes