Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, hpux100, Вы писали:
H>>Подскажите, можно ли получить список всех окон у запущенных на данный момент приложений.
VF>можно
И зовём её изначально для десктопа, GetDesktopWindow();
А потом внутри для каждого ребёнка.
А ещё, как вариант, есть функции-енумераторы, для топ-окон: EnumWindows, для детей: EnumChildWindows.
Только тут важно помнить, что EnumChildWindows будет перечислять не только прямых детей, а всех детей вообще.
Здравствуйте, CEMb, Вы писали:
CEM>Только тут важно помнить, что EnumChildWindows будет перечислять не только прямых детей, а всех детей вообще.
Хм.
The EnumChildWindows function enumerates the child windows that belong to the specified parent window by passing the handle to each child window, in turn, to an application-defined callback function.
Или я что-то не так понял.
А вообще, строго говоря, задача энумерации окон некорректная. Пока мы их энумерируем, там старое окно померло или новое народилось. То-то в Spy++ F5 — Refresh.
Здравствуйте, Pavel Dvorkin, Вы писали:
CEM>>Только тут важно помнить, что EnumChildWindows будет перечислять не только прямых детей, а всех детей вообще.
PD>Хм. PD>The EnumChildWindows function enumerates the child windows that belong to the specified parent window by passing the handle to each child window, in turn, to an application-defined callback function. PD>Или я что-то не так понял.
Можешь не сумлеваться — таки не понял.
PD>А вообще, строго говоря, задача энумерации окон некорректная. Пока мы их энумерируем, там старое окно померло или новое народилось. То-то в Spy++ F5 — Refresh.
В подражание Dvorkin — глубокомысленное Хм.
Ишь — "задача энумерации окон некорректная".
Пока в Spy++ на окно глазеем — у окна-то и евонный заголовок возьми да изменись, а то и размер/положение/стиль итд итп.
Не доглядел ты, Dvorkin.
А за "То-то в Spy++ F5 — Refresh" спасибо, уморил.
P.S. Строго говоря — почитал бы, что ль, в том же MSDN по-вдумчивее сопоставление GetWindow c Enum(Child)Windows.
Здравствуйте, kero, Вы писали:
CEM>>И зовём её изначально для десктопа, GetDesktopWindow();
K>тогда — список НЕ всех окон
CEM>>А ещё, как вариант, есть функции-енумераторы, для топ-окон: EnumWindows, для детей: EnumChildWindows.
K>аналогично
Ну и что я пропустил? Дети тех, кто не в топе?
Да накрайняк я их всех перебором проверю!!!
Кстати, это один из методов отлова руткитов.
Здравствуйте, Pavel Dvorkin, Вы писали:
CEM>>Только тут важно помнить, что EnumChildWindows будет перечислять не только прямых детей, а всех детей вообще.
PD>Хм.
PD>The EnumChildWindows function enumerates the child windows that belong to the specified parent window by passing the handle to each child window, in turn, to an application-defined callback function.
PD>Или я что-то не так понял.
Там колбак подсовывается, в который дети один за другим приходят. Но мне больше нравится FindWindowEx, или GetWindow, потому что в енумах приходят внуки, правнуки и далее... Я не знаю, почему так, но так оно у меня работало, и так в msdn-е где-то написано было. Короче, если дерево там строить — надо проверять, что родитель окна — то что (например) в LPVParam засунули (как я это 7 лет назад делал).
PD>А вообще, строго говоря, задача энумерации окон некорректная. Пока мы их энумерируем, там старое окно померло или новое народилось. То-то в Spy++ F5 — Refresh.
Дык все задачи переписи населения такие
Можно, конечно на эвент про создание окна подписаться, но я думаю, топикстартеру это не надо.
CEM>Там колбак подсовывается, в который дети один за другим приходят. Но мне больше нравится FindWindowEx, или GetWindow, потому что в енумах приходят внуки, правнуки и далее... Я не знаю, почему так, но так оно у меня работало, и так в msdn-е где-то написано было. Короче, если дерево там строить — надо проверять, что родитель окна — то что (например) в LPVParam засунули (как я это 7 лет назад делал).
Да, верно. Я уж не помню, использовал ли я эту функцию когда-либо, наверное, нет.
PD>>А вообще, строго говоря, задача энумерации окон некорректная. Пока мы их энумерируем, там старое окно померло или новое народилось. То-то в Spy++ F5 — Refresh.
CEM>Дык все задачи переписи населения такие
CEM>Можно, конечно на эвент про создание окна подписаться
И уничтожение.
>но я думаю, топикстартеру это не надо.
CEM>Там колбак подсовывается, в который дети один за другим приходят. Но мне больше нравится FindWindowEx, или GetWindow, потому что в енумах приходят внуки, правнуки и далее... Я не знаю, почему так, но так оно у меня работало, и так в msdn-е где-то написано было. Короче, если дерево там строить — надо проверять, что родитель окна — то что (например) в LPVParam засунули (как я это 7 лет назад делал). Минздрав Microsoft предупреждает:
The EnumChildWindows function is more reliable than calling GetWindow in a loop. An application that calls GetWindow to perform this task risks being caught in an infinite loop or referencing a handle to a window that has been destroyed.
Думаю к FindWindowEx это тоже относится.
Как много веселых ребят, и все делают велосипед...
1. Это нифига не дерево. Надо было листом называть.
2. Работает ооочень долго. Моя искалка, написанная 7 лет назад, тут же отработала за три секунды.
3. Нихрена непонятно. Ну, то есть, понятно, конечно, но в таблице лазить искать, например, кто кому кто — не айс.
3.1. Особенно когда в отладке сидишь, вообще не катит, ждать по 10-20 секунд пока дерево пересоберётся.
4. Никакого оповещения о том что программа завершила работу.
5. Анцестор рут отсутсвует!
Здравствуйте, ononim, Вы писали:
CEM>>Там колбак подсовывается, в который дети один за другим приходят. Но мне больше нравится FindWindowEx, или GetWindow, потому что в енумах приходят внуки, правнуки и далее... Я не знаю, почему так, но так оно у меня работало, и так в msdn-е где-то написано было. Короче, если дерево там строить — надо проверять, что родитель окна — то что (например) в LPVParam засунули (как я это 7 лет назад делал). O>Минздрав Microsoft предупреждает: O>
The EnumChildWindows function is more reliable than calling GetWindow in a loop. An application that calls GetWindow to perform this task risks being caught in an infinite loop or referencing a handle to a window that has been destroyed.
O>Думаю к FindWindowEx это тоже относится.
Хм, надо поэкпериментировать, но я ни разу на дедлок не нарывался. Только если по своей вине
Здравствуйте, CEMb, Вы писали:
CEM>1. Это нифига не дерево. Надо было листом называть. CEM>2. Работает ооочень долго. Моя искалка, написанная 7 лет назад, тут же отработала за три секунды. CEM>3. Нихрена непонятно. Ну, то есть, понятно, конечно, но в таблице лазить искать, например, кто кому кто — не айс. CEM>3.1. Особенно когда в отладке сидишь, вообще не катит, ждать по 10-20 секунд пока дерево пересоберётся. CEM>4. Никакого оповещения о том что программа завершила работу. CEM>5. Анцестор рут отсутсвует!
CEM>Вобщем, сей артефакт: CEM>Пауэр: 5. CEM>Юзабилити: -2.
Отвечу тебе коротко и мягко:
1) все, что ты тут понаписал — безусловная херня недалекого юзера, какой пункт ни возьми,
2) и брось эти свои фирменные восхваления каких-то никому неведомых своих прожек без каких-либо ссылок, кодов и аттачей, таки достала эта болтовня,
чай, тут не форум для хлестаковых и графоманов, и слава богу есть возможности объективной аргументации.
The EnumChildWindows function is more reliable than calling GetWindow in a loop. An application that calls GetWindow to perform this task risks being caught in an infinite loop or referencing a handle to a window that has been destroyed.
O>Думаю к FindWindowEx это тоже относится.
Касательно поведения GetWindow и FindWindowEx довелось заметить следующее.
В обычных условиях (независимо от того, установлено ли IMM/IME или нет)
полное дерево окон через GetWindowTree и полное дерево окон через FindWindowTree полностью совпадают
(GetWindowTree и FindWindowTree см. в исходнике http://files.rsdn.ru/42164/wintreesnap.zip), —
но вот после запуска исходного кода топика ПереZагруZка
Здравствуйте, kero, Вы писали:
K>Здравствуйте, CEMb, Вы писали:
CEM>>1. Это нифига не дерево. Надо было листом называть. CEM>>2. Работает ооочень долго. Моя искалка, написанная 7 лет назад, тут же отработала за три секунды. CEM>>3. Нихрена непонятно. Ну, то есть, понятно, конечно, но в таблице лазить искать, например, кто кому кто — не айс. CEM>>3.1. Особенно когда в отладке сидишь, вообще не катит, ждать по 10-20 секунд пока дерево пересоберётся. CEM>>4. Никакого оповещения о том что программа завершила работу. CEM>>5. Анцестор рут отсутсвует!
CEM>>Вобщем, сей артефакт: CEM>>Пауэр: 5. CEM>>Юзабилити: -2.
K>Отвечу тебе коротко и мягко: K>1) все, что ты тут понаписал — безусловная херня недалекого юзера, какой пункт ни возьми, K>2) и брось эти свои фирменные восхваления каких-то никому неведомых своих прожек без каких-либо ссылок, кодов и аттачей, таки достала эта болтовня, K>чай, тут не форум для хлестаковых и графоманов, и слава богу есть возможности объективной аргументации.
Керо, ты не понял просто в ПТУ пересдачи пошли осенние — вот и наплыв!
Здравствуйте, kero, Вы писали:
K>Отвечу тебе коротко и мягко: K>1) все, что ты тут понаписал — безусловная херня недалекого юзера, какой пункт ни возьми,
Чо, пьедестал пошатнулся? K>2) и брось эти свои фирменные восхваления каких-то никому неведомых своих прожек без каких-либо ссылок, кодов и аттачей, таки достала эта болтовня,
Т.е. тебе можно, а мне нельзя? K>чай, тут не форум для хлестаковых и графоманов, и слава богу есть возможности объективной аргументации.
Читай иногда свои посты сам Тебе замечания делали несколько человек, тока нимб, наверно, на глаза упал.