![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: нет Всего: 5 |
Сразу скажу я очень далек от WinApi. Задача такая получить список окон на рабочем столе которые входят в определенный квадрат, например:
Нужно получить окна которые входят в квадрат 200х200(top,left) 500х500(width,height). Посмотрев как можно вообще получить список окно я нашел только EnumWindow, но это как то не совсем то что я ожидал. В идеале получить бы массив этих окон, и получить то что выше всех. Подскажите в какую сторону мне посмотреть ? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Вы правильно смотрите в сторону EnumWindows, эта функция перечислит все окна верхнего уровня. Вам останется только:
1. Получить координаты каждого (GetWindowRect) 2. Проверить их на пересечение с вашим квадратом (IntersectRect) 3. В случае, если пересечение существует - добавить дескриптор окна в Ваш список. Добавлено через 3 минуты и 3 секунды Выше всех будет либо самое первое, либо самое последнее окно, приходящее в callback от EnumWindows -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: нет Всего: 5 |
Я думал есть более простой способ, ну мол сразу массив получить. Но ,сделал по вашему совету, только еще добавил проверку на видимость окна IsWindowVisible ,а то уж много лишних каких то окно было, даже те что в трее )))
|
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
есть, платишь деньги и тебе за них готовую программу. глянь еще в сторону функции WindowFromPoint() -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: нет Всего: 5 |
Да я не про это, просто вызов callback функции для получения такого списка, уж простите ,но это через жопу. В чем проблема вернуть массив в ф-ции которая возвращает все хэндлы? Так как мне вариант с callback показался как минимум странным, я поэтому и спросил насчет другого решения. В любом случае спасибо за помощь. |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
В Windows не всё так просто -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: нет Всего: 5 |
Я собственно говоря так и сделал
Это сообщение отредактировал(а) ecspertiza - 30.1.2013, 20:24 |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Почему винду сразу не сделали по человечески ??? это риторический вопрос с твоей стороны. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: нет Всего: 5 |
||||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
Одной из причин может быть обратная совместимость. Т.е. изначально, разработчики придумали "так", а потом уже не стали менять, т.к. многие программы уже использовали эту функцию именно в таком виде.
Вообще, это на любителя, ИМХО. Кому как нравится. Например, мне больше нравится вариант с callback. Вот у вас есть конкретное условие, по которому нужно отобрать окна. Но таких условий у разных разработчиков могут быть тысячи. Разработчикам Windows нужно было реализовать все возможные и невозможные варианты? Разве не разумнее сделать один общий шаблонный механизм, который бы подошёл всем? И тут они поступили логично: внутри реализации EnumWindows() они перебирают все окна в цикле и для каждого окна вызывают вашу функцию, внутри которой вы уже любыми изощрёнными способами определяете - нужно вам это окно или нет. Ну, так как-то... -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Да нифига d WinAPI есть функции при постоянном вызове которой будет возвращать данные, а если данных нет то вернет FLASE говорящей что пора заканчивать перечисление. И это сто раз лучше callback хотя б потому что не надо статической делать в классе.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
В multithread будут проблемы. Да и в реализации (со стороны Windows) это сложнее. Так что MS тут сэкономила себе работу. Это сообщение отредактировал(а) xvr - 31.1.2013, 16:10 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
И что потом делать с этим массивом? Как освобождать? Это нужно было придумывать целую церемению по правильному освобождению массивов. Что было бы чревато последствиями забывания оного, и порождало бы возмущенные вопросы типа: "нахрена мне этот массив, когда я ищу одно окно?". Колбэк, имхо нормалное решение. Самое универсальное, и самое эффективное. Каким и должен быть низкоуровневый интерфейс. Добавлено через 1 минуту и 55 секунд И вообще, вы судите о винапи с сегодняшней точки зрения. А она писалась в 80-х годах прошлого века. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
даже если судить о ней "с сегодняшней точки зрения", максимум, что может быть эффективнее - это колбек, которому передается не один дескриптор, а сразу "пачка". Актуально будет в многооконной системе ( > 10-100 тыс. top-окон ), от которой нас сейчас отделяет совсем немного (возможно как раз сдерживающим фактором является API, которое в этих условиях будет подтормаживать не особо шустрые машинки ). И то, скорее всего первым делом появится вопрос: "а насколько такая `пачка` актуальна, т.е. синхронизирован ли ее порядок и нужно ли проверять каждый ее дескриптор на существование?" Не могу представить себе, чтобы на момент такого обхода блокировалась вся подсистема GUI, а ведь именно это потребуется, чтобы дать Вам гарантии, что массив актуален. В идеале, там "над API" должны сидеть люди, которые просчитывают нагрузку, которую может сгенерировать неграмотный код, и сопоставляют, насколько такие инструменты будут целесообразно вводить простым смертным. Наверняка есть критический порог нагрузки, который конкретные API никогда не будут генерировать, а это же целая наука. Судя по тому, что API мало меняется, но очень сильно расширяется - такой критический порог уже давно достигнут, и более глубокий апгрейд решается уже на системном уровне, где исключается возможность неграмотных манипуляций с системой. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |