Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/35: Рейтинг темы: голосов - 35, средняя оценка - 4.51
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171

Как отследить события чужого окна?

06.04.2021, 19:22. Показов 8111. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Помогите, пожалуйста в решении следующей задачи...
Есть окно цель которого "следить" за неким участком экрана, а точнее за тем, что происходит под ним.. .
Допустим, что окно следит за Paint-ом, браузером или word-ом и пользователь двигает(или скролит) этот самый Paint, word или браузер.
Окно должно двигаться вслед за действиями пользователя.
Т.е. окно должно как бы приклеится к "отслеживаемой поверхности".
Сделать это можно двумя способами:
Первый, отслеживать и анализировать графические изменения на экране.
Теоретически есть и второй способ.... (вероятно, более простой, если знать как это делать)
Определить hWnd отслеживаемого окна(находящегося под следящим окном) и отслеживать его события.
Если, не трудно подскажите, пожалуйста как это делается, а точнее...
Как получить hWnd окна находящегося под следящим окном?
И как отследить события окна по hWnd?
Заранее, Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2021, 19:22
Ответы с готовыми решениями:

Как добавить свою кнопку в title-bar ЧУЖОГО окна?
Как добавить свою кнопку в title-bar ЧУЖОГО окна? Насколько я понял, полазив по Сети, это непростая задача. Есть примеры добавления...

Как зная дескриптор чужого окна сделать его неактивным?
Подскажите пожалуйста, как зная дескриптор чужого окна сделать его неактивным (невосприимчивым к левым и правым кликам мыши и нажатием...

Как отследить разфокуксировку окна
Помогите плиз!!! Как отследить когда Мое окно потеряет фокус, т.е. пользователь перейдет на др приложение!

53
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
06.04.2021, 21:32
Цитата Сообщение от nigri_lupus Посмотреть сообщение
Есть окно цель которого "следить" за неким участком экрана, а точнее за тем, что происходит под ним.. .
Есть куча способов как определить hWnd любого окна. Например FindWindow, по заголовку или GetForegroundWindow - раз с ним работают, значит оно в приоритете, по координатам мыши WindowFromPoint и т.д. и т.п.
По hWnd определяем его координаты на экране. Своё окно двигаем по этим же координатам. Не вижу тут ни каких сложностей.
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
06.04.2021, 23:31  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Не вижу тут ни каких сложностей.
Я понимаю, что задачка не сам тожеая сложная. В принципе, это так же как нарисовать прямоугольник. Если знаешь команду
PureBasic
1
Box
- это элементарно, а вот, если даже не догадываешься, как называется команда, которой прямоугольник рисуется, закачка кажется очень сложной. :-)
Цитата Сообщение от Pro_grammer Посмотреть сообщение
GetForegroundWindow - раз с ним работают
Ну в тот момент, когда надо закрепить окно сканера(следящее окно), активным будет как раз окно сканера, т.к. пользователь должен нажать на кнопку фиксации..
Цитата Сообщение от Pro_grammer Посмотреть сообщение
FindWindow, по заголовку
тоже вряд ли.... Тут скорее надо определение по координатам, а точнее по частичным координатам....Часть одного окна (или окно целиком) находится под другим окном....
Примерно как на этом скриншоте....
После нажатия на кнопку "прикрепить" окно должно "понять", что уровнем ниже находится окно Purebasic, т.е. узнать его hWnd
Миниатюры
Как отследить события чужого окна?  
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
06.04.2021, 23:55  [ТС]
Суть в том, чтобы зафиксировать одно окна над участком другого окна. При этом заголовка окна, за участком которого надо следить заранее(до закрепления мы не знаем). если часть окна за которым идет слежка сдвигается(а это может произойти либо при скроллинге либо при передвижении прослеживаемого окна) следящее окно следует за сдвинутой частью окна.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
07.04.2021, 06:41
Цитата Сообщение от nigri_lupus Посмотреть сообщение
чтобы зафиксировать одно окна над участком другого окна.
А если там снизу будет 2 или 5 окон?
Цитата Сообщение от nigri_lupus Посмотреть сообщение
мы не знаем
Значит вы должны решить, каким способом вы будете указывать на окно, за которым будете следить. Обычно это 2 способа, или выбор окна из всего списка запущенных окон в данный момент, или прямо указать на нужное окно щёлкнув по заголовку мышкой. Можете придумать свой способ, но решать, за каким окном следить по любому должен юзер.
Цитата Сообщение от nigri_lupus Посмотреть сообщение
если часть окна за которым идет слежка сдвигается
Как может двигаться часть окна? Если у окна поменялись координаты, то это отразится в GetWindowRect, а если внутри окна что то двигается, то какая разница для следящей программы?
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
07.04.2021, 11:15  [ТС]
Pro_grammer, Сейчас проиллюстрирую ответы (буквально) :-)
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Как может двигаться часть окна? Если у окна поменялись координаты, то это отразится в GetWindowRect, а если внутри окна что то двигается, то какая разница для следящей программы?
Окно моей программы следит за изменениями определенной экранной области..
На рисунке 1 это шахматная доска.
На рисунке 2 это стакан тетриса.
Но и доску и стакан рисует на экране другое приложение - НЕ МОЁ. Это может быть браузер или другая программа. (шахматный или тетрисный клиент) :-)
Пользователь при помощи окна сканера говорит машине где находится (на данный момент) на экране стакан тетриса или доска с шахматами. (т.е. расположение и размеры графического объекта за которым надо следить)
После того как пользователь "сказал машине" шахматы\стакан находятся тут и размеры у шахматной доски\стакана такие-то, то есть расположил сканер в нужном месте и придал ему соответствующие размеры, он нажимает кнопку зафиксировать.
После чего сканер приступает к выполнению своих основных функций - слежке за "графическим объектом" и анализом его изменений. (В случае с шахматами, кто куда и как походил, а в случае с тетрисом, как какие фигуры и куда падают)
Но, пользователь может случайно немного (или много :-) проскролить страницу браузера или подвинуть (опять же случайно) приложение, которое отображает эту самую доску или стакан.
В этом случае, окно сканера должно " дико закричать: "эй стакан, стакан ты куда из моего поля зрения убегаешь, я за тобой следить должен! Как я теперь узнаю, кто в тебя там падает!" или "Доска, постой, мне ж видеть надо кто как ходить будет!" и ринуться в погоню за удирающим графическим объектом, чтобы продолжить наблюдать кто-как походил или какая фигура в стакан упала"
Думаю, что обрисовал достаточно наглядно и с юмором...
А если чуток посерьезнее..
Изначально у меня была идея, следить не сдвинулся ли рисунок за которым идет наблюдение(т.е. доска\стакан), но...отследить движение (именно движение, а не просто изменение) графического объекта на экране задачка не простая, да ещё и ресурсоёмкая. (Допустим на шахматной доске передвинули фигуру - это одно дело... как раз за этим программа и должна наблюдать по сути. Это изменение внутри самого объекта наблюдения. Другое дело это когда координаты объекта наблюдения изменились. Т.е. пользователь случайно задел скроллинг браузера - доска съехала с того места на котором находилась. и всё...следить за неё уже как-то проблематично.)
В этом случае сканер должен либо подстроится под доску либо сообщить пользователю, что наблюдение более не возможно, потому как он не видит объекта за которым надо наблюдать...
Потом я подумал вот над чем, ведь любая картинка на экране это какое-то окно или часть какого-то окна. Так почему вместо достаточно сложного графического анализа, которого и так в программе будет много, не следить за событиями окна выводящего на экран картинку доски(стакана) и если в окне за картинкой которого мы следим происходит скроллинг или изменение координат окна, значит картинка тоже сдвинется и надо бы подвинуть в след за ней и окно сканера.
Фух, вроде объяснил....:-)
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А если там снизу будет 2 или 5 окон?
Может, но непосредственно под окном сканера и в момент начала отслеживания только одно... Потому, что в противном случае, онка будут перекрывать графический объект(стакан\доску)....
Я полагаю, что даже самый близорукий и криворукий пользователь (сужу по себе :-) ) вряд ли расположит сканер так, что отслеживаемый графический объект будет перекрыт другими окнами. Даже допустив погрешность в размерах в ширине, высоте и координатах сканера в десятки пикселей, уж его центр точно будет расположен над сканируемой картинкой, а следовательно и над окном эту картинку создающим. :-)
Миниатюры
Как отследить события чужого окна?   Как отследить события чужого окна?  
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
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‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
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‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
12.04.2021, 15:51
Например, через WindowFromPoint.
0
Модератор
10056 / 3901 / 884
Регистрация: 22.02.2013
Сообщений: 5,852
Записей в блоге: 79
12.04.2021, 16:42
Сабклассинг окна чужого процесса - не такая простая задача. Нужно писать DLL и внедрять в процесс. Более того для каждой разрядности нужно делать свою DLL. Можно обойтись и одним приложением, но нужно хорошо разбираться в ассемблере.
Вообще задача изначально решается неправильно, нужно просто из памяти процесса читать нужные данные и все, без всяких сканеров.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
12.04.2021, 17:43
Цитата Сообщение от The trick Посмотреть сообщение
нужно просто из памяти процесса читать нужные данные и все, без всяких сканеров.
Как снимать видео или скриншоты читая нужные данные из памяти процесса?
Это же продолжение тем автора Назначение цвета прозрачным, Дырявое окно и т.п.
0
Модератор
10056 / 3901 / 884
Регистрация: 22.02.2013
Сообщений: 5,852
Записей в блоге: 79
12.04.2021, 18:49
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Как снимать видео или скриншоты читая нужные данные из памяти процесса?
Это вообще лишнее звено. Вот что ТС написал:
Цитата Сообщение от nigri_lupus Посмотреть сообщение
После чего сканер приступает к выполнению своих основных функций - слежке за "графическим объектом" и анализом его изменений. (В случае с шахматами, кто куда и как походил, а в случае с тетрисом, как какие фигуры и куда падают)
Ему нужно следить либо за шахматами, либо за фигурами.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
12.04.2021, 19:33
Цитата Сообщение от The trick Посмотреть сообщение
Ему нужно следить либо за шахматами, либо за фигурами.
Возможно. Но это очень специфично. Т.е под каждый случай нужно написать свою программу, которая будет из памяти процесса читать нужные данные. Например, есть на Пурике программа, которая жульничает с игрой Сапёр, останавливает таймер как раз читая и меняя данные в памяти процесса Сапёр. Но нужно знать по какому адресу эти данные, иначе ни как.
А распознавание образов с экрана будет более универсально. Просто сверять с некоторым интервалом картинки. Так работают детекторы движения в реальном времени с камеры наблюдения.
0
Модератор
10056 / 3901 / 884
Регистрация: 22.02.2013
Сообщений: 5,852
Записей в блоге: 79
12.04.2021, 21:06
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А распознавание образов с экрана будет более универсально.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Но нужно знать по какому адресу эти данные
Это 2 несравнимые задачи. Анализ и распознавание намного более сложная задача чем получение значения из памяти. Насчет универсальности, то тут тоже не все так радужно, т.к. для каждого типа распознавания нужен свой алгоритм. С таким же успехом можно иметь описание адресов которые нужно считывать.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
12.04.2021, 22:40
Цитата Сообщение от The trick Посмотреть сообщение
Анализ и распознавание намного более сложная задача чем получение значения из памяти.
Ну для кого как
Цитата Сообщение от The trick Посмотреть сообщение
можно иметь описание адресов которые нужно считывать
Каким образом это сделать практически? Сколько займет вычисление адресов для десятка шахматных программ? А ещё учесть, что адреса меняются после выхода обновления. А если движок на сервере, и надо не адреса вычислять, а трафик анализировать?
Вычислить методом сравнения двух изображений, что сделан ход, откуда и куда, разве сложнее?

Добавлено через 5 минут
А для шахмат вообще всё ещё проще. Можно анализировать не сами ходы, а ведение шахматной записи. Обычно все ходы отображаются в текстовом виде.
0
Модератор
10056 / 3901 / 884
Регистрация: 22.02.2013
Сообщений: 5,852
Записей в блоге: 79
12.04.2021, 22:50
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Каким образом это сделать практически? Сколько займет вычисление адресов для десятка шахматных программ? А ещё учесть, что адреса меняются после выхода обновления.
Это зависит от многих факторов. Сколько займет создание распознавателя для десятка шахматных программ?

Цитата Сообщение от Pro_grammer Посмотреть сообщение
А если движок на сервере, и надо не адреса вычислять, а трафик анализировать?
Ну так в клиент тебе в любом случае данные придут, как минимум чтобы обновить в нужном месте информацию.

Цитата Сообщение от Pro_grammer Посмотреть сообщение
Вычислить методом сравнения двух изображений, что сделан ход, откуда и куда, разве сложнее?
Сложнее. Возьмем те же шахматы. К примеру в одних реализациях может быть анимированный ход, какие-либо всплывающие окна ну и т.п. Если идти таким путем то нужен интеллектуальный распознаватель. Или возьмем тетрис, там на скрине фон сделан шумом Перлина, а вдруг он анимированный? В общем в любом аспекте данный подход сложен, как алгоритмически, так и вычислительно. Там вообще судя по всему JS-код, там вообще просто получить нужные значения.

Добавлено через 1 минуту
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А для шахмат вообще всё ещё проще. Можно анализировать не сами ходы, а ведение шахматной записи. Обычно все ходы отображаются в текстовом виде.
Это другой разговор, да так более правильней. Но и тут стоит учитывать такие вещи как формат вывода и т.п.
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
13.04.2021, 14:22  [ТС]
The trick, Решение через адреса памяти тут ну совсем не подходит. Причин на то много и отчасти они тут уже перечислены Pro_grammer-ом. Программа изначально задумывалась как универсальный графический распознаватель.
Цитата Сообщение от The trick Посмотреть сообщение
Возьмем те же шахматы. К примеру в одних реализациях может быть анимированный ход, какие-либо всплывающие окна ну и т.п
Это не трудно обработать. любая анимация с точки зрения графики - набор скриншотов и имеет начало и конец, т.е. первый кадр - последний кадр. Собственно всплывающие окна можно тоже отсеять как "графический мусор".
Цитата Сообщение от The trick Посмотреть сообщение
Если идти таким путем то нужен интеллектуальный распознаватель
Он то по сути и пишется, а вопрос о окнах, был попыткой немного упростить задачу(как показало время и диалог с Pro_grammer-ом ошибочной попыткой).
Цитата Сообщение от The trick Посмотреть сообщение
Или возьмем тетрис, там на скрине фон сделан шумом Перлина, а вдруг он анимированный? В общем в любом аспекте данный подход сложен, как алгоритмически, так и вычислительно
Ну, тут на самом деле относительно просто решается :-)

Добавлено через 7 минут
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Как снимать видео или скриншоты читая нужные данные из памяти процесса?
Ну, видео тут не потребуется. скорее скришоты, но идею Вы поняли идеально.
Кстати, ( прошу прощения за небольшой офтоп)... Можно ли сделать скрин того, что под окном, не убирая при этом само окно с экрана? Полагаю, что нет, но, вдруг ошибаюсь... это помогло бы.

Добавлено через 7 минут
Замабувараев, А что вернет WindowFromPoint, Если данная точка принадлежит нескольким окнам? (башня из окон :-) Т.е. когда несколько окон проходят через точку... (окно над окном, над окном, над окном) :-)
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
13.04.2021, 15:04
Цитата Сообщение от nigri_lupus Посмотреть сообщение
что вернет WindowFromPoint
Верхнее видимое окно, выше уже писал об этой функции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.04.2021, 15:04
Помогаю со студенческими работами здесь

Как отследить нажатие кнопки вне окна?
Нужно отслеживать нажатие кнопки вне формы(отслеживать надо сразу после запуска приложения) и при каждом нажатии просто издавать звук.

Как отследить открытие нового окна в outlook?
Mne bi pri poyavlenii novogo okna tuda svoe menu zapihivat'. Spasibo. P.S. Nachalnik nastoyatelno rekomendoval ;(

Как изменить размер чужого окна?
Нужно создать панель управления размера окна определенного приложения. И еще полноэкранный режим. Можно ли это сделать программно? ...

Как отследить события на USB?
Здравствуйте. Есть подозрение, что какой-то драйвер или программа перехватывает USB порты на короткое время, в связи с чем рвется...

Как предотвратиь появление определенного чужого окна
Написал прогу, которая постоянно перебирает все окна и закрывает, если у окна определенный заголовок #include <windows.h> BOOL...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru