|
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
|
|
Как отследить события чужого окна?06.04.2021, 19:22. Показов 8122. Ответов 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 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
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 Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|