Отслеживание всплывающего из трея окна календаря/времени

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
akm-2005
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 04.03.2016 (Пт) 11:05

Отслеживание всплывающего из трея окна календаря/времени

Сообщение akm-2005 » 25.09.2019 (Ср) 16:28

Всем привет.
Циклично скриншотирую полнооткрытую страницу IE с открытым всплывающим-из-трея-окном-календаря/времени (в win7)... (в цикле меняются адреса страниц)
Открываю это всплывающее окно из трея с помощью программного нажатия мышью по часам в трее (после каждой полной загрузки страницы в IE):
Код: Выделить всё
SetCursorPos + mouse_event (MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

Все получается, вот только момент полной прорисовки этого всплывающего окна не могу отследить достоверно ДО скриншотирования (то есть без работы с точками скриншота)...
Пробовал и
Код: Выделить всё
hWndClockFlyoutWindow = FindWindow("ClockFlyoutWindow", vbNullString)
- hWnd после "тыка" находит, но не дает достоверно убедиться в полной прорисовке окна к моменту нахождения hWnd;
и
Код: Выделить всё
r = GetWindowThreadProcessId(hWndClockFlyoutWindow, pID)
pHandle = OpenProcess(&H100000, True, pID)
WaitForInputIdle pHandle, &HFFFF
CloseHandle pHandle
- тоже раньше прорисовки отрабатывает...

За неимением вариантов - делаю паузу через Sleep или DoEvents длиной около секунды... Однако задача будет выполняться и на других компьютерах, где паузы может не хватить... Да и время на паузы тратить жалко (цикл может быть большим)...)))
Как я предполагаю, это всплывающее окно календаря/времени - та еще штучка, так просто не вызывается и не отслеживается...

В общем, вопрос: кто-то знает, как можно отследить полную прорисовку этого окна без скриншотирования экрана?
Или, если таковое невозможно, помогите пжст с идеями - как не наугад (паузой), а достоверно, дождаться готовности этого окошка к "фотографированию".

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Отслеживание всплывающего из трея окна календаря/времени

Сообщение ger_kar » 25.09.2019 (Ср) 17:10

Интересная задача:
Надо подумать и поэкспериментировать в таком направлении.
Собственно пока идея такая: после нахождения окна через FindWindow попробовать поискать дочерние окна через FindWindowEx. И попробовать получить например текст из такого дочернего окна. Т.е. найти окно, потом в нем найти поле со временем кнопку и получить из этого поля текст. По идее к этому времени окно должно быть уже прорисовано, но как будет на сомом деле х.з. Поэтому нужен эксперимент.
Бороться и искать, найти и перепрятать

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Отслеживание всплывающего из трея окна календаря/времени

Сообщение Vova_2581 » 26.09.2019 (Чт) 0:19

akm-2005 писал(а):В общем, вопрос: кто-то знает, как можно отследить полную прорисовку этого окна без скриншотирования экрана?

Может быть попробовать IsWindows или как-то так... IsWindowVisible..??.. Может прокатит??

akm-2005
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 04.03.2016 (Пт) 11:05

Re: Отслеживание всплывающего из трея окна календаря/времени

Сообщение akm-2005 » 26.09.2019 (Чт) 10:16

Уважаемые, спасибо за идеи. Попробовал обе. )))
На данный момент получилось так:
Код: Выделить всё
' №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
' Открыть окно календаря/времени из трея
' №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
Dim rClock As RECT
hWndClock = FindWindow("Shell_TrayWnd", vbNullString)
hWndClock = FindWindowEx(hWndClock, 0, "TrayNotifyWnd", vbNullString)
hWndClock = FindWindowEx(hWndClock, 0, "TrayClockWClass", vbNullString)
GetWindowRect hWndClock, rClock
' Итеративно тыкать в трей и дожидаться полной прорисовки всплывающего окна календаря/времени
Do
    Sleep 10 ' ставить задержку (миллисек) между итерациями проверки готовности окна
    bWinIsOpen = False
    hWndClockFlyoutWindow = FindWindow("ClockFlyoutWindow", vbNullString)
    If hWndClockFlyoutWindow <> 0 Then
        ' Искать дочку класса DirectUIHWND
        hD = FindWindowEx(hWndClockFlyoutWindow, 0, "DirectUIHWND", vbNullString)
        ' Искать первую попавшуюся правнучку класса ClockWndMain во внучках класса CtrlNotifySink
        Do
            hCN = FindWindowEx(hD, hCN, "CtrlNotifySink", vbNullString)
            If hCN <> 0 Then hCW = FindWindowEx(hCN, 0, "ClockWndMain", vbNullString)
        Loop Until hCW <> 0
        ' Проверить появление видимости правнуческого окна календаря/времени
        If IsWindowVisible(hCW) <> 0 Then bWinIsOpen = True
    Else
        ' Указатель мыши передвинуть на часы в трее
        Call SetCursorPos((rClock.Right + rClock.Left) / 2, (rClock.Top + rClock.Bottom) / 2)
        ' Эмулировать нажатие на кнопку мыши
        mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
    End If
Loop Until bWinIsOpen = True

И в итерациях почему-то не работает "сначала-тыканье-потом-проверка", а именно так - "сначала-проверка-потом-тыканье".
Буду тестировать и совершенствовать дальше... Окошко-то - пугливое: живо скрывается при кликаньях, остановках в коде... )))

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отслеживание всплывающего из трея окна календаря/времени

Сообщение Хакер » 27.09.2019 (Пт) 17:02

akm-2005 писал(а):Или, если таковое невозможно, помогите пжст с идеями - как не наугад (паузой), а достоверно, дождаться готовности этого окошка к "фотографированию".

Нарисовать что-нибудь в окне, послать сообщение с просьбой о перерисовке, и проверяь, остался ли нарисованный опознавательный признак на месте.


О каком окошке речь? Что надо сделать (установить, настроить), чтобы поиметь возможность поиграться с этим всплывающим окошком и поэкспериментировать с методами воздействия на него?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Отслеживание всплывающего из трея окна календаря/времени

Сообщение Vova_2581 » 27.09.2019 (Пт) 19:13

Хакер писал(а):О каком окошке речь?

Об этом...
Screen1.jpg
Screen1.jpg (29.11 Кб) Просмотров: 2490

А вот окошко, где часы...
Screen2.jpg
Screen2.jpg (9.27 Кб) Просмотров: 2490

Почему-то не отвечает на посылаемые ему оконные сообщения кликов, типа - WM_LBUTTONDBLCLK, WM_LBUTTONDOWN, BN_CLICKED, BM_CLICK и прочие... даже через WM_COMMAND, видимо окно игнорирует эти сообщения. А вот кликнуть через mouse_event получается. В чем прикол???

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отслеживание всплывающего из трея окна календаря/времени

Сообщение Хакер » 27.09.2019 (Пт) 23:53

Это встроенная часть Windows 7, или какой-то софт выводит это окно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Отслеживание всплывающего из трея окна календаря/времени

Сообщение iGrok » 28.09.2019 (Сб) 18:05

Встроенная часть висты и последующих, да. По ощущениям работает точно так же как меню "Пуск", только при клике по часам.
label:
cli
jmp label

akm-2005
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 04.03.2016 (Пт) 11:05

Re: Отслеживание всплывающего из трея окна календаря/времени

Сообщение akm-2005 » 30.09.2019 (Пн) 8:55

Да, без установки паузы (через DoEvents или Sleep) мне пока не удается гарантированно ловить момент полной прорисовки этого окна календаря/времени и момент полного его пропадания...
Приходится все-таки скриншотировать и проверять точку картинки (внутри района всплывающего окна) на определенный цвет...
Тесты показывают, что в цикле из 4 скриншотируемых страниц периодически "фальстарты" возникают 1-2 раза...
Но в целом такой подход - довольно быстрый, т.к. нет пауз.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Отслеживание всплывающего из трея окна календаря/времени

Сообщение ger_kar » 30.09.2019 (Пн) 11:29

akm-2005 писал(а):Приходится все-таки скриншотировать и проверять точку картинки (внутри района всплывающего окна) на определенный цвет...
Крайне не надежный способ. Достаточно изменения цветовой темы, для того чтобы алгоритм "сломался".
Бороться и искать, найти и перепрятать

akm-2005
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 04.03.2016 (Пт) 11:05

Re: Отслеживание всплывающего из трея окна календаря/времени

Сообщение akm-2005 » 04.10.2019 (Пт) 15:49

Вполне допускаю. Надежность низкая. Пока ничего умнее не придумал, да и здесь новых идей пока нет.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Отслеживание всплывающего из трея окна календаря/времени

Сообщение The trick » 07.07.2024 (Вс) 20:55

Для начала поставить обработчик событий SetWinEventHook и посмотреть есть ли какое событие которое приходит гарантированно после отрисовки.
UA6527P


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

    TopList