|
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
|
|
Как отследить события чужого окна?06.04.2021, 19:22. Показов 8111. Ответов 53
Метки нет (Все метки)
Здравствуйте!
Помогите, пожалуйста в решении следующей задачи... Есть окно цель которого "следить" за неким участком экрана, а точнее за тем, что происходит под ним.. . Допустим, что окно следит за Paint-ом, браузером или word-ом и пользователь двигает(или скролит) этот самый Paint, word или браузер. Окно должно двигаться вслед за действиями пользователя. Т.е. окно должно как бы приклеится к "отслеживаемой поверхности". Сделать это можно двумя способами: Первый, отслеживать и анализировать графические изменения на экране. Теоретически есть и второй способ.... (вероятно, более простой, если знать как это делать) Определить hWnd отслеживаемого окна(находящегося под следящим окном) и отслеживать его события. Если, не трудно подскажите, пожалуйста как это делается, а точнее... Как получить hWnd окна находящегося под следящим окном? И как отследить события окна по hWnd? Заранее, Спасибо!
0
|
|
| 06.04.2021, 19:22 | |
|
Ответы с готовыми решениями:
53
Как добавить свою кнопку в title-bar ЧУЖОГО окна? Как зная дескриптор чужого окна сделать его неактивным? Как отследить разфокуксировку окна |
|
|
||
| 06.04.2021, 21:32 | ||
|
По hWnd определяем его координаты на экране. Своё окно двигаем по этим же координатам. Не вижу тут ни каких сложностей.
0
|
||
|
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
|
|||||||||
| 06.04.2021, 23:31 [ТС] | |||||||||
Примерно как на этом скриншоте.... После нажатия на кнопку "прикрепить" окно должно "понять", что уровнем ниже находится окно Purebasic, т.е. узнать его hWnd
0
|
|||||||||
|
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
|
|
| 06.04.2021, 23:55 [ТС] | |
|
Суть в том, чтобы зафиксировать одно окна над участком другого окна. При этом заголовка окна, за участком которого надо следить заранее(до закрепления мы не знаем). если часть окна за которым идет слежка сдвигается(а это может произойти либо при скроллинге либо при передвижении прослеживаемого окна) следящее окно следует за сдвинутой частью окна.
0
|
|
|
|
||||
| 07.04.2021, 06:41 | ||||
![]()
0
|
||||
|
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
|
|||
| 07.04.2021, 11:15 [ТС] | |||
|
Pro_grammer, Сейчас проиллюстрирую ответы (буквально) :-)
На рисунке 1 это шахматная доска. На рисунке 2 это стакан тетриса. Но и доску и стакан рисует на экране другое приложение - НЕ МОЁ. Это может быть браузер или другая программа. (шахматный или тетрисный клиент) :-) Пользователь при помощи окна сканера говорит машине где находится (на данный момент) на экране стакан тетриса или доска с шахматами. (т.е. расположение и размеры графического объекта за которым надо следить) После того как пользователь "сказал машине" шахматы\стакан находятся тут и размеры у шахматной доски\стакана такие-то, то есть расположил сканер в нужном месте и придал ему соответствующие размеры, он нажимает кнопку зафиксировать. После чего сканер приступает к выполнению своих основных функций - слежке за "графическим объектом" и анализом его изменений. (В случае с шахматами, кто куда и как походил, а в случае с тетрисом, как какие фигуры и куда падают) Но, пользователь может случайно немного (или много :-) проскролить страницу браузера или подвинуть (опять же случайно) приложение, которое отображает эту самую доску или стакан. В этом случае, окно сканера должно " дико закричать: "эй стакан, стакан ты куда из моего поля зрения убегаешь, я за тобой следить должен! Как я теперь узнаю, кто в тебя там падает!" или "Доска, постой, мне ж видеть надо кто как ходить будет!" и ринуться в погоню за удирающим графическим объектом, чтобы продолжить наблюдать кто-как походил или какая фигура в стакан упала" ![]() ![]() Думаю, что обрисовал достаточно наглядно и с юмором... А если чуток посерьезнее.. Изначально у меня была идея, следить не сдвинулся ли рисунок за которым идет наблюдение(т.е. доска\стакан), но...отследить движение (именно движение, а не просто изменение) графического объекта на экране задачка не простая, да ещё и ресурсоёмкая. (Допустим на шахматной доске передвинули фигуру - это одно дело... как раз за этим программа и должна наблюдать по сути. Это изменение внутри самого объекта наблюдения. Другое дело это когда координаты объекта наблюдения изменились. Т.е. пользователь случайно задел скроллинг браузера - доска съехала с того места на котором находилась. и всё...следить за неё уже как-то проблематично.) В этом случае сканер должен либо подстроится под доску либо сообщить пользователю, что наблюдение более не возможно, потому как он не видит объекта за которым надо наблюдать... Потом я подумал вот над чем, ведь любая картинка на экране это какое-то окно или часть какого-то окна. Так почему вместо достаточно сложного графического анализа, которого и так в программе будет много, не следить за событиями окна выводящего на экран картинку доски(стакана) и если в окне за картинкой которого мы следим происходит скроллинг или изменение координат окна, значит картинка тоже сдвинется и надо бы подвинуть в след за ней и окно сканера. Фух, вроде объяснил....:-) Я полагаю, что даже самый близорукий и криворукий пользователь (сужу по себе :-) ) вряд ли расположит сканер так, что отслеживаемый графический объект будет перекрыт другими окнами. Даже допустив погрешность в размерах в ширине, высоте и координатах сканера в десятки пикселей, уж его центр точно будет расположен над сканируемой картинкой, а следовательно и над окном эту картинку создающим. :-)
0
|
|||
|
|
|
| 07.04.2021, 13:02 | |
|
Задача ясная, но сложно для исполнения.
Начать с того, что ваша прога универсальная, и может снимать любой участок экрана в любой программе. А вот программы все разные и исполнение интерфейса разное. Где то скролл это стандартный Виндовый, то следить можно, предварительно узнав его Дескриптор GetScrollPos_(hWnd, #SB_VERT);SB_HORZ Где то самописный и руками нарисованный? Где то может нужное пространство закроется всплывающим окном с рекламой, а где то стандартной мессагой. Все случаи трудно предусмотреть. Наверно по тому в прогах, снимающих видео экрана, вся ответственность на человеке, который за этим следит?
0
|
|
|
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
|
|
| 07.04.2021, 16:19 [ТС] | |
|
Pro_grammer, Да всего не предусмотришь, например о самописном скроле и всплывающем окне я даже подумал.
Ответственность с пользователя на самом деле никто не снимает... Так тоже окно сканера это на самом деле упрощение задачи Изначально, она была куда сложнее. Окно сканера собственно служит указателем координат и размеров графического объекта. (Т.е. убирает необходимость машине самостоятельно искать шахматную доску по всему экрану и определять её размеры. Первая задумка была именно такой. ) Во вторых, окно показывает пользователю, где у компьютера сейчас глаза находятся.Детектор движения тут выполняет роль подстраховки. (грубо говоря защиты от дурака) Но, вероятно, реализовывать детектор движения придется всё же при помощи графического анализа.
0
|
|
|
COM‐пропагандист
|
|
| 08.04.2021, 12:54 | |
|
Вы что, про сабклассинг первый раз слышите?
Берёте hwnd нужного окна, дальше GetWindowLongPtr с параметром GWLP_WNDPROC, потом назначаете свою оконную процедуру через SetWindowLongPtr и обрабатываете все сообщения которые надо, не забывая отправлять обратно в старую оконную процедуру.
0
|
|
|
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
|
|
| 11.04.2021, 21:04 [ТС] | |
|
Замабувараев, Для начала нужно узнать какое окно нужное? (Т.е. какому окну принадлежит картинка)
0
|
|
|
COM‐пропагандист
|
|
| 12.04.2021, 15:51 | |
|
Например, через WindowFromPoint.
0
|
|
|
Модератор
|
|
| 12.04.2021, 16:42 | |
|
Сабклассинг окна чужого процесса - не такая простая задача. Нужно писать DLL и внедрять в процесс. Более того для каждой разрядности нужно делать свою DLL. Можно обойтись и одним приложением, но нужно хорошо разбираться в ассемблере.
Вообще задача изначально решается неправильно, нужно просто из памяти процесса читать нужные данные и все, без всяких сканеров.
0
|
|
|
|
||
| 12.04.2021, 17:43 | ||
|
Это же продолжение тем автора Назначение цвета прозрачным, Дырявое окно и т.п.
0
|
||
|
|
||
| 12.04.2021, 19:33 | ||
|
А распознавание образов с экрана будет более универсально. Просто сверять с некоторым интервалом картинки. Так работают детекторы движения в реальном времени с камеры наблюдения.
0
|
||
|
Модератор
|
|||
| 12.04.2021, 21:06 | |||
|
0
|
|||
|
|
|||
| 12.04.2021, 22:40 | |||
![]() Вычислить методом сравнения двух изображений, что сделан ход, откуда и куда, разве сложнее? Добавлено через 5 минут А для шахмат вообще всё ещё проще. Можно анализировать не сами ходы, а ведение шахматной записи. Обычно все ходы отображаются в текстовом виде.
0
|
|||
|
Модератор
|
|||||
| 12.04.2021, 22:50 | |||||
|
Добавлено через 1 минуту
0
|
|||||
|
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
|
|||||
| 13.04.2021, 14:22 [ТС] | |||||
|
The trick, Решение через адреса памяти тут ну совсем не подходит. Причин на то много и отчасти они тут уже перечислены Pro_grammer-ом. Программа изначально задумывалась как универсальный графический распознаватель.
Добавлено через 7 минут Кстати, ( прошу прощения за небольшой офтоп)... Можно ли сделать скрин того, что под окном, не убирая при этом само окно с экрана? Полагаю, что нет, но, вдруг ошибаюсь... это помогло бы. Добавлено через 7 минут Замабувараев, А что вернет WindowFromPoint, Если данная точка принадлежит нескольким окнам? (башня из окон :-) Т.е. когда несколько окон проходят через точку... (окно над окном, над окном, над окном) :-)
0
|
|||||
|
|
|
| 13.04.2021, 15:04 | |
|
0
|
|
| 13.04.2021, 15:04 | |
|
Помогаю со студенческими работами здесь
20
Как отследить открытие нового окна в outlook? Как изменить размер чужого окна? Как отследить события на USB? Как предотвратиь появление определенного чужого окна Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|