c ++ - Hvorfor returnerer EnumWindows flere vinduer end forventet?

Indlæg af Hanne Mølgaard Plasc

Problem



I VC ++ bruger jeg EnumWindows (...), GetWindow (...) og GetWindowLong (), for at få listen over windows og kontrollere om vinduet er øverste vindue (ikke andet vindue som ejer), og om vinduet er synlig (WS\_VISIBLE). Men selvom mit skrivebord kun viser 5 vinduer, giver dette EnumWindows mig 50 vinduer, hvor sjovt! Enhver Windows-geek her kan du hjælpe mig med at præcisere ...

Bedste reference


Måden at udelukke kun Windows på proceslinjen (eller tilsvarende i Alt-Tab-boksen) er beskrevet af Raymond i denne artikel på MSDN blog:

http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx[4]


Og dette er superfunktionen for at kontrollere om et vindue vises i alt-fanen:


BOOL IsAltTabWindow(HWND hwnd)
{
    TITLEBARINFO ti;
    HWND hwndTry, hwndWalk = NULL;

    if(!IsWindowVisible(hwnd))
        return FALSE;

    hwndTry = GetAncestor(hwnd, GA\_ROOTOWNER);
    while(hwndTry != hwndWalk) 
    {
        hwndWalk = hwndTry;
        hwndTry = GetLastActivePopup(hwndWalk);
        if(IsWindowVisible(hwndTry)) 
            break;
    }
    if(hwndWalk != hwnd)
        return FALSE;

    // the following removes some task tray programs and "Program Manager"
    ti.cbSize = sizeof(ti);
    GetTitleBarInfo(hwnd, &ti);
    if(ti.rgstate[0] & STATE\_SYSTEM\_INVISIBLE)
        return FALSE;

    // Tool windows should not be displayed either, these do not appear in the
    // task bar.
    if(GetWindowLong(hwnd, GWL\_EXSTYLE) & WS\_EX\_TOOLWINDOW)
        return FALSE;

    return TRUE;
}


Krediteret til kildekoden her:

http://www.dfcd.net/projects/switcher/switcher.c[5]

Andre referencer 1


Vinduerne, som du taler om, med en X-knap og en titellinje osv. Er ikke den eneste slags vinduer. Knapper, rullemenuer, etiketter, ikoner, tekstbokse, proceslinjen og næsten alt andet er også et vindue 1 . Så EnumWindows gør præcis, hvad det skal gøre: opregner alle topniveau vinduer.


1 Selvom dette er sandt, opregner EnumWindows kun vinduerne på øverste niveau. Det betyder at det ikke vil optælle nogen børnevinduer: [6]



  EnumWindows-funktionen opregner ikke børnevinduer, med undtagelse af et par vinduer i topniveau, der ejes af systemet, der har WS\_CHILD-stilen.



Men mange ting på dit skrivebord er også vinduer, ikke kun de 'vinduer' du tænker på.