В VС++ я использую EnumWindows (...), GetWindow (...) и GetWindowLong(), чтобы получить список окон и проверить, находится ли окно в верхнем окне (нет другого окна как владельца) и отображается ли окно (WS_VISIBLE). Однако, хотя мой рабочий стол показывает только 5 окон, этот EnumWindows дает мне 50 окон, как смешно! Любой Windows geek здесь, пожалуйста, помогите мне уточнить...
Почему EnumWindows возвращает больше окон, чем я ожидал?
Ответ 1
Способ отображения только окон на панели задач (или аналогично в окне Alt-Tab) описан Raymond в этой статье в блоге 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
Ответ 2
Окно, о котором вы говорите, с кнопкой X и заголовком и т.д. - это не единственный вид окон. Кнопки, выпадающие меню, ярлыки, значки, текстовые поля, панель задач и почти все остальное тоже окно 1. Таким образом, EnumWindows
выполняет именно то, что он должен делать: перечислить все окна верхнего уровня.
1 Даже если это верно, EnumWindows
перечисляет только окна верхнего уровня. Это означает он не будет перечислять дочерние окна:
Функция EnumWindows не перечисляет дочерние окна, за исключением нескольких окон верхнего уровня, принадлежащих системе со стилем WS_CHILD.
Однако многие вещи на вашем рабочем столе также являются окнами, а не только "окна", о которых вы думаете.