Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список окон в области 
:(
    Опции темы
ecspertiza
Дата 30.1.2013, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: нет
Всего: 5



Сразу скажу я очень далек от WinApi. Задача такая получить список окон на рабочем столе которые входят в определенный квадрат, например:

Нужно получить окна которые входят в квадрат 200х200(top,left) 500х500(width,height).

Посмотрев как можно вообще получить список окно я нашел только EnumWindow, но это как то не совсем то что я ожидал. В идеале получить бы массив этих окон, и получить то что выше всех. Подскажите в какую сторону мне посмотреть ?


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
GremlinProg
Дата 30.1.2013, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Вы правильно смотрите в сторону EnumWindows, эта функция перечислит все окна верхнего уровня. Вам останется только:
1. Получить координаты каждого (GetWindowRect)
2. Проверить их на пересечение с вашим квадратом (IntersectRect)
3. В случае, если пересечение существует - добавить дескриптор окна в Ваш список.

Добавлено через 3 минуты и 3 секунды
Выше всех будет либо самое первое, либо самое последнее окно, приходящее в callback от EnumWindows


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
ecspertiza
Дата 30.1.2013, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: нет
Всего: 5



Я думал есть более простой способ, ну мол сразу массив получить. Но ,сделал по вашему совету, только еще добавил проверку на видимость окна IsWindowVisible ,а то уж много лишних каких то окно было, даже те что в трее )))


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Dem_max
Дата 30.1.2013, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Цитата

Я думал есть более простой способ

есть, платишь деньги и тебе за них готовую программу.

глянь еще в сторону функции WindowFromPoint()


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
ecspertiza
Дата 30.1.2013, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: нет
Всего: 5



Цитата(Dem_max @  30.1.2013,  15:46 Найти цитируемый пост)
есть, платишь деньги и тебе за них готовую программу.


Да я не про это, просто вызов callback функции для получения такого списка, уж простите ,но это через жопу. В чем проблема вернуть массив в ф-ции которая возвращает все хэндлы? Так как мне вариант с callback показался как минимум странным, я поэтому и спросил насчет другого решения. В любом случае спасибо за помощь.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
artsb
Дата 30.1.2013, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



Цитата(ecspertiza @  30.1.2013,  19:43 Найти цитируемый пост)
Да я не про это, просто вызов callback функции для получения такого списка, уж простите ,но это через жопу. В чем проблема вернуть массив в ф-ции которая возвращает все хэндлы? Так как мне вариант с callback показался как минимум странным, я поэтому и спросил насчет другого решения. В любом случае спасибо за помощь. 

В Windows не всё так просто smile ИМХО, если бы и была такая функция, то она бы делала тоже самое что и вы. Оберните поиск в функцию в отдельном юните и будет вам супер функция, удовлетворяющая вашим требованиям smile


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ecspertiza
Дата 30.1.2013, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: нет
Всего: 5



Я собственно говоря так и сделал smile Просто изначальное решение не совсем красиво. Я некоем образом не хотел обидеть WinAPI разрабов, но мне просто не ясна логика этого решения, зачем callback ? Я к тому, почему сразу разработчики WinAPI не смогли сделать по человечески. Я слабо знаком с WinAPI, но то с чем сталкивался это просто ужас.

Это сообщение отредактировал(а) ecspertiza - 30.1.2013, 20:24


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Dem_max
Дата 30.1.2013, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Цитата

почему сразу разработчики WinAPI не смогли сделать по человечески.

Почему винду сразу не сделали по человечески ??? это риторический вопрос с твоей стороны.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
ecspertiza
Дата 30.1.2013, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: нет
Всего: 5



Цитата(Dem_max @  30.1.2013,  20:58 Найти цитируемый пост)
это риторический вопрос с твоей стороны


пожалуй да smile


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
artsb
Дата 30.1.2013, 21:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



Цитата(ecspertiza @  30.1.2013,  20:22 Найти цитируемый пост)
мне просто не ясна логика этого решения, зачем callback ?

Одной из причин может быть обратная совместимость. Т.е. изначально, разработчики придумали "так", а потом уже не стали менять, т.к. многие программы уже использовали эту функцию именно в таком виде.
Цитата(ecspertiza @  30.1.2013,  20:22 Найти цитируемый пост)
Я к тому, почему сразу разработчики WinAPI не смогли сделать по человечески.

Вообще, это на любителя, ИМХО. Кому как нравится. Например, мне больше нравится вариант с callback. Вот у вас есть конкретное условие, по которому нужно отобрать окна. Но таких условий у разных разработчиков могут быть тысячи. Разработчикам Windows нужно было реализовать все возможные и невозможные варианты? Разве не разумнее сделать один общий шаблонный механизм, который бы подошёл всем? И тут они поступили логично: внутри реализации EnumWindows() они перебирают все окна в цикле и для каждого окна вызывают вашу функцию, внутри которой вы уже любыми изощрёнными способами определяете - нужно вам это окно или нет.
Ну, так как-то... smile


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
xvr
Дата 31.1.2013, 14:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(ecspertiza @  30.1.2013,  20:22 Найти цитируемый пост)
но мне просто не ясна логика этого решения, зачем callback ?

Во первых экономили память (во времена Windows 1.0 ее было не много  smile )
А во вторых из callback'а можно сделать массив, а вот наоборот нельзя. Поэтому и взяли более общий вариант.

PM MAIL   Вверх
Dem_max
Дата 31.1.2013, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Да нифига d WinAPI есть функции при постоянном вызове которой будет возвращать данные, а если данных нет то вернет FLASE говорящей что пора заканчивать перечисление. И это сто раз лучше callback хотя б потому что не надо статической делать в классе.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xvr
Дата 31.1.2013, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(Dem_max @  31.1.2013,  14:50 Найти цитируемый пост)
Да нифига d WinAPI есть функции при постоянном вызове которой будет возвращать данные, а если данных нет то вернет FLASE говорящей что пора заканчивать перечисление.

В multithread будут проблемы. Да и в реализации (со стороны Windows) это сложнее. Так что MS тут сэкономила себе работу.


Это сообщение отредактировал(а) xvr - 31.1.2013, 16:10
PM MAIL   Вверх
volatile
Дата 31.1.2013, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(ecspertiza @  30.1.2013,  19:43 Найти цитируемый пост)
это через жопу. В чем проблема вернуть массив в ф-ции которая возвращает все хэндлы

И что потом делать с этим массивом? Как освобождать?
Это нужно было придумывать целую церемению по правильному освобождению массивов.
Что было бы чревато последствиями забывания оного, и порождало бы возмущенные вопросы типа: "нахрена мне этот массив, когда я ищу одно окно?".

Колбэк, имхо нормалное решение. Самое универсальное, и самое эффективное.
Каким и должен быть низкоуровневый интерфейс.

Добавлено через 1 минуту и 55 секунд
И вообще, вы судите о винапи с сегодняшней точки зрения.
А она писалась в 80-х годах прошлого века.

PM MAIL   Вверх
GremlinProg
Дата 1.2.2013, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(volatile @  1.2.2013,  01:39 Найти цитируемый пост)
И вообще, вы судите о винапи с сегодняшней точки зрения.А она писалась в 80-х годах прошлого века.

даже если судить о ней "с сегодняшней точки зрения", максимум, что может быть эффективнее - это колбек, которому передается не один дескриптор, а сразу "пачка". Актуально будет в многооконной системе ( > 10-100 тыс. top-окон ), от которой нас сейчас отделяет совсем немного  (возможно как раз сдерживающим фактором является API, которое в этих условиях будет подтормаживать не особо шустрые машинки ).

И то, скорее всего первым делом появится вопрос: "а насколько такая `пачка` актуальна, т.е. синхронизирован ли ее порядок и нужно ли проверять каждый ее дескриптор на существование?" Не могу представить себе, чтобы на момент такого обхода блокировалась вся подсистема GUI, а ведь именно это потребуется, чтобы дать Вам гарантии, что массив актуален.

В идеале, там "над API" должны сидеть люди, которые просчитывают нагрузку, которую может сгенерировать неграмотный код, и сопоставляют, насколько такие инструменты будут целесообразно вводить простым смертным. Наверняка есть критический порог нагрузки, который конкретные API никогда не будут генерировать, а это же целая наука. Судя по тому, что API мало меняется, но очень сильно расширяется - такой критический порог уже давно достигнут, и более глубокий апгрейд решается уже на системном уровне, где исключается возможность неграмотных манипуляций с системой.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.