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

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

06.04.2021, 19:22. Показов 8109. Ответов 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
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
13.04.2021, 15:29  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Верхнее видимое окно, выше уже писал об этой функции.
Спасибо, я видать пропустил со слепых глаз.
Pro_grammer,
Цитата Сообщение от nigri_lupus Посмотреть сообщение
Кстати, ( прошу прощения за небольшой офтоп)... Можно ли сделать скрин того, что под окном, не убирая при этом само окно с экрана?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
13.04.2021, 17:40
Цитата Сообщение от nigri_lupus Посмотреть сообщение
Можно ли сделать скрин того, что под окном, не убирая при этом само окно с экрана?
Можно, если знаешь HWND нужного окна.
Запускаем калькулятор и скрываем его.
Выполняем этот код:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 Procedure MakeWinScreenshot(ImageNr,hWnd,Width,Height) 
   hImage = CreateImage(ImageNr,Width,Height) 
   hDC = StartDrawing(ImageOutput(ImageNr)) 
      BitBlt_(hDC,0,0,Width,Height,GetDC_(hWnd),0,0,#SRCCOPY) 
   StopDrawing() 
   ProcedureReturn hImage 
EndProcedure 
 
OpenWindow(1,0,0,300,300,"",#PB_Window_SystemMenu|#PB_Window_Invisible|#PB_Window_ScreenCentered) 
  hShotWindow = FindWindow_(0,"Калькулятор")   ; Тут заголовок нужного окна!
  If hShotWindow 
    hWinBmp  = MakeWinScreenshot(1,hShotWindow,300,300) 
    ImageGadget(1,0,0,300,300,hWinBmp) 
  EndIf 
 
HideWindow(1,0) 
 
Repeat 
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow : End 
  EndSelect 
ForEver
Видим скрин скрытого окна.
0
Эксперт по электронике
6808 / 3233 / 337
Регистрация: 28.10.2011
Сообщений: 12,626
Записей в блоге: 7
13.04.2021, 18:11
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Видим скрин свёрнутого окна.
Скрин получим только есть калькулятор развернут, но его закрывают другие окна.
Если свернуть, скрина нет.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
13.04.2021, 18:25
Цитата Сообщение от locm Посмотреть сообщение
только есть калькулятор развернут, но его закрывают другие окна.
Ну так то нам это и нужно!
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
17.04.2021, 16:42  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ну так то нам это и нужно!
Pro_grammer, Спасибо. Действительно полезно будет.
Заранее прошу прощения за еще один глупый вопрос....
Как правильно пользоваться функцией WindowFromPoint_, точнее как она пишется?
Почитал по ней справку, вроде всё понятно. (так казалось). Попробовал написать малюсенький кодик определяющий клик ЛКМ в любой точке экрана. Вроде бы и задача проще не придумаешь, а вот не получается, вероятно из-за неправильной формы записи:


PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
p.POINT
hwnd.i=-1
OpenWindow(0, 0, 0, 220, 100, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StickyWindow(0, 1)
flag.i = GetAsyncKeyState_(#VK_LBUTTON)
 
Repeat
  Event = WindowEvent()
  If flag<>GetAsyncKeyState_(#VK_LBUTTON)
    GetCursorPos_(@p)
    If Not flag
      Debug "Нажал"
      Debug WindowFromPoint_(p)
      hwnd = WindowFromPoint_(p)
    Else
      Debug "Отпустил"
      If hwnd = WindowFromPoint_(p)
        Debug "CLICK"
      EndIf
      hwnd = -1
    EndIf
    flag=GetAsyncKeyState_(#VK_LBUTTON)
  EndIf
  
Until Event = #PB_Event_CloseWindow
Что не так?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
17.04.2021, 17:46
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
p.POINT
hwnd.i=-1
OpenWindow(0, 0, 0, 220, 100, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StickyWindow(0, 1)
flag.i = GetAsyncKeyState_(#VK_LBUTTON)
 
Repeat
  Event = WindowEvent()
  If flag<>GetAsyncKeyState_(#VK_LBUTTON)
    GetCursorPos_(p)
    If Not flag
      Debug "Нажал"
      Debug WindowFromPoint_(p\x|p\y<<32)
      hwnd = WindowFromPoint_(p\x|p\y<<32)
    Else
      Debug "Отпустил"
      If hwnd = WindowFromPoint_(p\x|p\y<<32)
        Debug "CLICK"
      EndIf
      hwnd = -1
    EndIf
    flag=GetAsyncKeyState_(#VK_LBUTTON)
  EndIf
  
Until Event = #PB_Event_CloseWindow
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
17.04.2021, 18:56  [ТС]
Pro_grammer, простите за тупость. Если можете, объясните, пожалуйста кусок строчки
PureBasic
1
p\x|p\y<<32
Ну, не могу я понять, что это такое...
Вроде бы параметр функции - структура POINT, но почему не P, а "p\x|p\y<<32"????
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
17.04.2021, 20:14
Цитата Сообщение от nigri_lupus Посмотреть сообщение
p\x|p\y<<32
WindowFromPoint в качестве аргумента принимает структуру, которая состоит из 2-х чисел x и y , каждое по 4 байта.
мы соединяем эти 2 числа методом побитового ИЛИ со сдвигом на 32 (4*8) бита, получается как бы одно записано сразу за другим.
Потренируйся :
PureBasic
1
2
3
4
5
  a.w = %1000 | %0101 
Debug Bin(a) ; смешались 
 
a.w = %1000 | %0101<<4
Debug Bin(a) ; теперь одно за другим
0
18.04.2021, 08:47

Не по теме:

Цитата Сообщение от Pro_grammer Посмотреть сообщение
(p\x|p\y<<32)
Лучше переходите на Си.

0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
18.04.2021, 12:14
Цитата Сообщение от Замабувараев Посмотреть сообщение
Лучше переходите на Си.
Наверняка User32.dll написан на Cи, так что чему удивляться?
Есть ещё такой вариант:
PureBasic
1
WindowFromPoint_(PeekQ(@p))
Так тоже будет работать.
1
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
18.04.2021, 15:52  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Лучше переходите на Си.
Ничего против С не имею, но тут возникнет целая куча мелких проблем....
1. Пока я освою синтаксис С, точнее даже не синтаксис, а названия его функций и операторов меня на форуме либо проклянут либо забанят за кучу тупых вопросов
2. С бывает разных версий... и на какую переходить?
3. У С есть два небольших для большинства, но существенных для меня недостатка...
3.1. Объявление библиотек(h - файлов) очень весело когда не знаешь ни названия команды ни в где её искать. Забыл например подключить математическую библиотеку и сиди думай, почему у тебя у тебя строчка а=sin(b) ошибку вызывает, а если это не математическая библиотека, а что-то посложнее...
3.2 Насколько я помню, после компиляции на С пользователю нужно передавать весь пакет файлов(библиотек и т.д) иначе ехе у него работать не будет. Это не всегда хорошо.(правда слышал, что это можно задать при компиляции, но точно не знаю)
3.3. Вам покажется совсем уж смешным, но у PB неплохой РУССКИЙ Help. Ключевое РУССКИЙ.
4. И если уж переходить на С, сначала надо дописать то, что начал....Переводить с языка на язык...ухххх....я пробовал...у меня часть того, что я сейчас пишу была написана мною же толи на VB 2008, толи на VB 2010...(давно было дело) Попытался перевести на PB - пришлось писать заново.
Кстати, С и WinApi это же по сути одно и тоже? Ну точнее, WinApi это кусочек из С...верно?
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
18.04.2021, 15:57
Цитата Сообщение от nigri_lupus Посмотреть сообщение
Ничего против С не имею, но тут возникнет целая куча мелких проблем....
Си — это не волшебная таблетка, от смены названия языка и появления точек с запятой в конце строки проблема не решится.
Я имею ввиду, что конструкции вроде палочек и двойных знаков меньше — это ASCII‐арт и псевдографика в коде, принятая в Си, в то время как в бейсике принят verbose синтаксис.
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
18.04.2021, 16:05  [ТС]
Pro_grammer, Хотите посмеяться?
Цитата Сообщение от Pro_grammer Посмотреть сообщение
1
WindowFromPoint_(PeekQ(@p))
Так тоже будет работать.
Вот теперь я понял
p\x|p\y<<32 = PeekQ(@p)
PeekQ - Читает значение типа quad из памяти по указанному адресу.
@p - Адрес структуры Р
т.е. когда мы пишем p\x|p\y<<32, то получаем значение ВСЕЙ структуры P
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
18.04.2021, 16:11
Цитата Сообщение от Pro_grammer Посмотреть сообщение
WindowFromPoint в качестве аргумента принимает структуру, которая состоит из 2-х чисел x и y , каждое по 4 байта.
мы соединяем эти 2 числа методом побитового ИЛИ со сдвигом на 32 (4*8) бита, получается как бы одно записано сразу за другим.
Зачем так делать? Почему нельзя сразу передать туда переменную типа структуры?
0
Модератор
10056 / 3901 / 884
Регистрация: 22.02.2013
Сообщений: 5,852
Записей в блоге: 79
18.04.2021, 16:12
Цитата Сообщение от Замабувараев Посмотреть сообщение
Зачем так делать? Почему нельзя сразу передать туда переменную типа структуры?
В PB нельзя передавать структуры по значению.
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
18.04.2021, 16:18  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Зачем так делать? Почему нельзя сразу передать туда переменную типа структуры?
Вот это и вызывало у меня непонимание.... почему WindowFromPoint_(p\x|p\y<<32), а не WindowFromPoint_(p) и если и так, то тогда что значит p\x|p\y<<32? Теперь понял.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
18.04.2021, 17:20
Цитата Сообщение от Замабувараев Посмотреть сообщение
Зачем так делать?
Знаете как это сделано в VB6?
Visual Basic
1
Private Declare Function WindowFromPoint Lib "user32.dll" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
В старых версиях PureBasic, как сейчас в VB6, WindowFromPoint не по феншую принимал 2 параметра, хотя в справке MSDN описан один - POINT Point.
Но с появлением x64 в PB такой способ передачи стал невозможен и разработчик был вынужден сделать как в справке. Но костыль допилили не до конца
Хотя я не понимаю, почему. Как и FreeBasic не работает напрямую с системными библиотекми, а через обёртку своих библиотек. Но в FB сразу сделано как надо библиотека libuser32.dll.a, тут тоже при желании можно было легко подправить с помощью того же PeekQ.
0
Модератор
10056 / 3901 / 884
Регистрация: 22.02.2013
Сообщений: 5,852
Записей в блоге: 79
18.04.2021, 17:25
Цитата Сообщение от Pro_grammer Посмотреть сообщение
В старых версиях PureBasic, как сейчас в VB6, WindowFromPoint не по феншую принимал 2 параметра, хотя в справке MSDN описан один - POINT Point.
Еще раз, в PB как и в VB6 нельзя передавать структуры по значению. В MSDN все верно.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
18.04.2021, 17:33
Цитата Сообщение от Pro_grammer Посмотреть сообщение
FreeBasic не работает напрямую с системными библиотекми
Фрибейсик не работает с библиотеками, он даже не работает даже с со своими библиотеками времени выполнения, ему вообще нет дела до библиотек. Фрибейсик лишь знает, что есть продекларированная в заголовочнике функция, для её вызова нужно выполнить несколько инструкций push и один call, ничего больше он о функции не знает и знать ему не надо.
С библиотеками работает компоновщик, это ему нужны каноніческие имена функций, ординалы, порядок и всякие __imp_.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
18.04.2021, 18:10
Цитата Сообщение от The trick Посмотреть сообщение
В MSDN все верно.
Да в этом я не сомневаюсь.
Цитата Сообщение от Замабувараев Посмотреть сообщение
С библиотеками работает компоновщик
Да не суть, что с чем работает, все они работают над созданием exe в целом.

Если я не понятно выражаюсь, то вот как можно было например сделать такой вызов как в FB WindowFromPoint(p) :

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Procedure WindowFromPoint(*P.POINT)
 ProcedureReturn WindowFromPoint_(PeekQ(*P))
EndProcedure
 
p.POINT
hwnd.i=-1
OpenWindow(0, 0, 0, 220, 100, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StickyWindow(0, 1)
flag.i = GetAsyncKeyState_(#VK_LBUTTON)
 
Repeat
  Event = WindowEvent()
  If flag<>GetAsyncKeyState_(#VK_LBUTTON)
    GetCursorPos_(p)
    If Not flag
      Debug "Нажал"
      Debug WindowFromPoint(p) 
      hwnd = WindowFromPoint(p) 
    Else
      Debug "Отпустил"
      If hwnd = WindowFromPoint(p) 
        Debug "CLICK"
      EndIf
      hwnd = -1
    EndIf
    flag=GetAsyncKeyState_(#VK_LBUTTON)
  EndIf
  
Until Event = #PB_Event_CloseWindow
т.е. подобие моей процедуры
PureBasic
1
2
3
Procedure WindowFromPoint(*P.POINT)
 ProcedureReturn WindowFromPoint_(PeekQ(*P))
EndProcedure
написать в свою встроенную библиотеку PureBasic.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2021, 18:10
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
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&amp;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