![]() |
eXeL@B —› Вопросы новичков —› Как узнать функцию-обработчик таймера по HWND окна? |
Посл.ответ | Сообщение |
|
Создано: 09 ноября 2006 10:52 · Личное сообщение · #1 Помогите советом: иследую программу CollMate, которая по истечении некоторого одинакого времени самозакрывается. ![]() Значит виноваты таймеры ![]() Ставлю бряки на SetTimer и получаю такое 0012FD4C 001701F8 |hWnd = 001701F8 (class='TPUtilWindow') 0012FD50 00000001 |TimerID = 1 0012FD54 00027100 |Timeout = 160000. ms 0012FD58 00000000 Timerproc = NULL Как найти процедуру обработки таймера? ![]() |
|
Создано: 09 ноября 2006 11:05 · Личное сообщение · #2 |
|
Создано: 09 ноября 2006 11:06 · Личное сообщение · #3 |
|
Создано: 09 ноября 2006 12:47 · Личное сообщение · #4 hell пишет: На чём прога написана? на Delphi При схеме, когда Timerproc = NULL и есть hWnd, класс окна должен наследовать функцию OnTimer(TimerID). Я так понимаю, что система каждые Timeout миллисекунд 1. Посилает меседж окну с определенными параметрами - я думаю это и есть наш случай 2. Вызывает callback функцию, это когда Timerproc != NULL Возможно ли в олли поставить фильтр на SendMessage/PostMessage окну c указаным hWnd и узнать их обработчика? asd пишет: Ожидание таймера осуществляется с помощью Wait функций (WaitForSingle(/Multiple)object) Спасибо за идею. Но как я узнаю функция ожидает таймер, а не скажем семафор? И как узнать по HANDLE узнать TimerID? ![]() |
|
Создано: 09 ноября 2006 13:21 · Личное сообщение · #5 amely Сори я что-то вообще не отех таймерах подумал. А на счёт твоего случая я никогда не пользовался сам и не сталкивался. Но если верить MSDN то: "If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message's MSG structure contains the value of the hWnd parameter. " из чего следует(если мне мой жуткий английский не изменяет ![]() P.S. А ты пробовал в Timeout при SetTimer загнать -1, или вместо Timerproc = NULL поставить адрес своего обработчика таймера. ![]() |
|
Создано: 09 ноября 2006 13:41 · Личное сообщение · #6 asd пишет: что тебе надо искать обработку сообщения WM_TIMER в оконной процедуре. клас у меня есть - class='TPUtilWindow', теперь попробую RegisterClassEx чтобы выяснить адрес оконной процедуры и там уже буду искать обработку сообщения WM_TIMER asd пишет: А ты пробовал в Timeout при SetTimer загнать -1, или вместо Timerproc = NULL поставить адрес своего обработчика таймера. Нет не пробовал. Хотя попробовать надо ![]() ![]() ![]() |
|
Создано: 09 ноября 2006 22:27 · Поправил: hell · Личное сообщение · #7 |
|
Создано: 10 ноября 2006 06:21 · Личное сообщение · #8 hell пишет: Возьми DeDe или SourceResourcer и посмотри адрес функции таймера пока что не знаю как ![]() hell пишет: Кинь ссылку на прогу. Collmate 1.34.2.73 unpacked and partly cracked ![]() ![]() rapidshare.com/files/1831815/collmate.rar.html - только exe инсталл здесь _http://www.sidency.com/download/collmate-en.exe (1,1 Mb) ![]() |
|
Создано: 11 ноября 2006 03:34 · Личное сообщение · #9 |
|
Создано: 11 ноября 2006 13:29 · Личное сообщение · #10 hell пишет: Ставишь бряк на адрес 5cd818 и ждешь. при закрытии прога прервется по этому адресу. Спасибо, но так и не вышел с этого адреса на оконную процедуру потому что уже выполнялась процедура закрытия приложения. Поскольку приложение закрывалось корректно (через ExitProcess), то поставил бряки на PostQuitMessages - и сработало ![]() ![]() На оконной процедуре вытянутой с RegisterClassEx - бряк не срабатывал ![]() ![]() |
|
Создано: 14 ноября 2006 08:10 · Личное сообщение · #11 amely пишет: 0012FD4C 001701F8 |hWnd = 001701F8 (class='TPUtilWindow') 0012FD50 00000001 |TimerID = 1 0012FD54 00027100 |Timeout = 160000. ms 0012FD58 00000000 Timerproc = NULL Как уже было сказано, событие таймера обрабатывает оконная проца. Судя по нестандартному классу окна ловить надо на RegisterClassEx/RegisterClass ATOM RegisterClassEx(
ATOM RegisterClass(
----- Я медленно снимаю с неё UPX... *FF_User* ![]() |
|
Создано: 14 ноября 2006 08:12 · Личное сообщение · #12 amely пишет: Возможно ли в общем случае зная hWnd окна, класс окна, и TimerID определить обработчик события WM_TIMER в данном окне и как? Если не ошибаюсь, то в оконную процу придет сообщение WM_TIMER (или что-то типа того), значение константы ищи в делфи или С (или асме). Только не завидую если оконная проца скомпилена как case. ----- Я медленно снимаю с неё UPX... *FF_User* ![]() |
|
Создано: 14 ноября 2006 08:53 · Личное сообщение · #13 Т.к. эти методы не работают (или плохо искали или что-то ещё ![]() LONG GetWindowLong(
За подробностями - в SDK или любой доступный хэлп по WinAPI. Ещё можно поюзать готовую прогу "inqsoft window scanner". Главное найти именно нужное окно, а там найдётся и Timer, если это действительно он, а не Thread ![]() ----- Я медленно снимаю с неё UPX... *FF_User* ![]() |
|
Создано: 15 ноября 2006 04:37 · Личное сообщение · #14 AlexZ пишет: Судя по нестандартному классу окна ловить надо на RegisterClassEx/RegisterClass Так и делал, вытягивал WNDPROC lpfnWndProc, ставил бряк - но он не срабатывал. AlexZ пишет: Если не ошибаюсь, то в оконную процу придет сообщение WM_TIMER В общем это так, если быть более точным, то функция DispatchMessage вызывает оконную процедуру для конкретного сообщения и для конкретного окна (hWnd). это справедливо и для WM_TIMER, если hWnd != NULL, иначе DispatchMessage вызывает callback функцию зарегестрированную при создании таймера. AlexZ пишет: Т.к. эти методы не работают (или плохо искали или что-то ещё ), то можно спросить оконную процу с помощью след. АПИ (придется написать небольшую программку): LONG GetWindowLong Вот в этом наверное и соль ![]() ![]() AlexZ пишет: Ещё можно поюзать готовую прогу "inqsoft window scanner" Спасибо! AlexZ пишет: Главное найти именно нужное окно, а там найдётся и Timer, если это действительно он, а не Thread Можно здесь поподробней об Thread. Или умеется ввиду Thread queue? Если таймеры отключить (например Timeout = 16000000 ms) - то программа будет работать 16000 секунд, после чего будет вызвана OnTimer, которая и сделает нехорошее дело ![]() ![]() |
|
Создано: 15 ноября 2006 09:45 · Поправил: AlexZ · Личное сообщение · #15 amely пишет: Я не совсем понимаю, как это будет проделывать поток, тоесть как Thread через указанный период времени чтото сделает. Я думаю без таймеров здесь не обойтись. Создать поток и заставить его поспать N милисекунд с помощью Sleep(N). Не исключено, что создается трэд, и в нем выполняются действия, которые по каким-то причинам нельзя побрякать.
----- Я медленно снимаю с неё UPX... *FF_User* ![]() |
|
Создано: 20 ноября 2006 13:20 · Личное сообщение · #16 ОК, однозначного метода как узнать функцию-обработчик таймера по HWND окна НЕТ. Можна пробовать следующие варианты: 1. Ставить бряки на RegisterClassEx/RegisterClass и вытягивать WNDPROC lpfnWndProc для класса окна. Потом в этой функции по switch(WM_XXX) искать case WM_TIMER; 2. Возможно что окно переопределит свою оконную функцию методами SetWindowLong или SetWindowLongPtr - тогда надо ставить условные бряки на них 3. Программами "inqsoft window scanner" или Spy++ или подобными искать оконную процедуру конкретного окна, или использовать АПИ GetWindowLong / GetWindowLongPtr 4. Возможно событие WM_TIMER обрабатывается в message loop, тогда надо смотреть для потока в котором работает таймер код иежду GetMessage и DispatchMessage. 5. Возможно таймер только для отвода глаз, а "работу" выполняет некоторый поток по Sleep. Наверное есть еще варианты, но они пока-что неизвестны мне ![]() Спасибо за ответы. Тему закрываю. ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Как узнать функцию-обработчик таймера по HWND окна? |
Эта тема закрыта. Ответы больше не принимаются. |