(во что бы то ни стало повторно пометить с соответствующей технологией: я не знаю, какие они:)
Я, вероятно, позже приду с более подробными вопросами, касающимися конкретных деталей, но сейчас я пытаюсь понять «общую картину»: я ищу способ перечисления «реально видимых окон» в Windows. Под «реально видимым окном» я имею в виду только то, что пользователь назвал бы «окном». Мне нужен способ получить список всех этих видимых окон в Z-порядке.
Обратите внимание, что я делаю действительно нужно сделать это. Я уже сделал это на OS X (где это настоящая головная боль, особенно если вы хотите поддерживать OS X 10.4, потому что OS X не имеет удобного Windows API), и теперь мне нужно сделать это под Windows.
Вот пример. Предположим, на экране есть три видимых окна, например:
+------------------------------------------+
| |
| +=============+ |
| | | |
| | A +--------------------------+
| | | |
| C | | B |
| | +--------------------------+
| | | |
+-----------| |----------------+
| |
+-------------+
Тогда мне нужно вернуть список, подобный этому:
windows B is at (210,40)
windows A is at (120,20)
windows C is at (0,0)
Тогда, если пользователь (или ОС) переносит окно A на передний план, оно становится:
+------------------------------------------+
| |
| +=============+ |
| | | |
| | A |---------------------+
| | | |
| C | | B |
| | |---------------------+
| | | |
+-----------| |----------------+
| |
+-------------+
И я получаю (в идеале) ответный звонок, дающий мне это:
windows A is at (120,20)
windows B is at (210,40)
windows C is at (0,0)
Выполнение этого в OS X требует использования удивительно странных хаков (например, обязательное включение пользователем «Включить доступ для вспомогательного устройства» !), Но я сделал это в OS X, и оно работает (под OS X мне не удавалось получить обратный вызов каждый раз, когда происходят какие-либо изменения в окне, поэтому я опрашиваю, но я заставил его работать).
Теперь я хочу сделать это под Windows (правда, нет вопросов), и у меня есть несколько вопросов:
это можно сделать?
Есть ли хорошо документированные API-интерфейсы Windows (и работающие согласно их спецификациям), позволяющие это сделать?
Легко ли регистрировать обратный вызов при каждом изменении окна? (если он был изменен, перемещен, перенесен назад / вперед или если всплыло новое окно и т. д.)
кем бы были готы?
Я знаю, что этот вопрос не является конкретным, поэтому я попытался описать свою проблему настолько четко, насколько это возможно (включая красивое искусство ASCII, за которое вы можете выразить это): сейчас я смотрю на "общую картину" ». Я хочу знать, что делает такая вещь под Windows.
Дополнительный вопрос: представьте, что вам нужно написать крошечный .exe , записывающий имена / положение / размер окон во временный файл каждый раз, когда на экране изменяется окно, как долго будет длиться такая программа приблизительно на выбранном вами языке и сколько времени вам понадобится для его написания?
(еще раз, я пытаюсь получить "большую картину", чтобы понять, что здесь происходит)