Почему EnumWindows возвращает больше окон, чем я ожидал? - PullRequest
16 голосов
/ 02 сентября 2011

В VC ++ я использую EnumWindows (...), GetWindow (...) и GetWindowLong (), чтобы получить список окон и проверить, является ли окно верхним окном (нет другого окна в качестве владельца), ивидимо ли окно (WS_VISIBLE).Однако, хотя мой рабочий стол показывает только 5 окон, эти EnumWindows дают мне 50 окон, как забавно!Любой выродок Windows здесь, пожалуйста, помогите мне уточнить ...

Ответы [ 2 ]

31 голосов
/ 03 сентября 2011

Способ перечисления только окон на панели задач (или аналогично в окне Alt-Tab) описан Рэймондом в этой статье в блоге MSDN:
http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx

И это супер функциячтобы проверить, отображается ли окно в alt-tab:

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

Зачислено на исходный код здесь:
http://www.dfcd.net/projects/switcher/switcher.c

4 голосов
/ 02 сентября 2011

Окна, о которых вы говорите, с кнопкой X, строкой заголовка и т. Д., Не являются единственными окнами. Кнопки, выпадающие меню, метки, значки, текстовые поля, панель задач и почти все остальное - это тоже окно 1 . Так что EnumWindows делает именно то, что должен: перечисляет все окна верхнего уровня.

1 Несмотря на то, что это правда, EnumWindows перечисляет только окна верхнего уровня. Это означает, что не будет перечислять дочерние окна :

Функция EnumWindows не перечисляет дочерние окна, за исключением нескольких окон верхнего уровня, принадлежащих системе, которые имеют стиль WS_CHILD.

Однако многие вещи на вашем рабочем столе также являются окнами, а не просто «окнами», о которых вы думаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...