Определить окна приложения - PullRequest
0 голосов
/ 13 августа 2010

Я использую CBT Windows Hook для обнаружения событий создания / удаления окна / min-max / move-size.

Я хорошо работаю, но мне нужно отфильтровать чьи события из обычных виджетов. Практически мне нужно, чтобы CBT-ловушка уведомляла меня только о тех окнах, которые пользователь считает Windows.

Проблема, с которой я сталкиваюсь, сводит меня с ума, так как я постоянно получаю ложные события, даже если я фильтрую окно следующим образом:

BOOL FilterWindowHandle(HWND hwnd)
{
    // Filtered window having WS_CHILDWINDOW style
    if ((GetWindowLongPtr(hwnd, GWL_STYLE) & WS_CHILDWINDOW) != 0)
        return (TRUE);
    // Filtered window not having WS_CAPTION style
    if ((GetWindowLongPtr(hwnd, GWL_STYLE) & WS_CAPTION) == 0)
        return (TRUE);
    // Not filtered
    return (FALSE);
}

Эти ложные события происходят от теневых эффектов, меню и всего, что отображается на экране.

Есть ли надежный метод для фильтрации реальных окон по дочерним элементам?

Я избегаю теста WS_BORDER или аналогичного, поскольку некоторые приложения могут создавать свое главное окно без рамки ... или я ошибаюсь?

Ответы [ 2 ]

1 голос
/ 26 декабря 2010

Подходит для "вещей, которые пользователь считает окнами", - это набор окон, отображаемых в списке Alt-Tab (или на панели задач).

В этой статье OldNewThing объясняются правила (хотя правила не являются фиксированными или гарантированно останутся прежними):

Общее правило:

Для каждого видимого окна поднимитесь цепочка владельцев пока не найдешь рут владелец. Затем идите обратно вниз по видимому последняя активная цепочка всплывающих окон, пока вы не найдете видимое окно. Если вы вернулись к где вы начали, а затем положить окно в списке Alt + Tab.

Это можно переопределить с помощью явных стилей окна:

Окно с WS_EX_TOOLWINDOW расширенный стиль рассматривается как если бы не были видны, даже если это так. окно с WS_EX_APPWINDOW расширенный стиль рассматривается как нет владельца, даже если это так.

См. Полный пост OldNewThing, откуда взяты эти две цитаты, для более подробной информации.

0 голосов
/ 26 декабря 2010

Полезным критерием, который я использовал в прошлом, является проверка того, является ли окно окном верхнего уровня, то есть его родительский элемент равен NULL.

...