Сейчас на форуме: vsv1, _MBK_ (+3 невидимых)

 eXeL@B —› Вопросы новичков —› WinMain
Посл.ответ Сообщение

Ранг: 16.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 26 августа 2007 18:55
· Личное сообщение · #1

Может я туплю, но как можно ещё ловить Window Messages - вот пример, в программе SetTimer без процедуры, но с HWND окна программы, в таймере дан ID, при перехвате WinMain по таймеру не вызывается, но как то же ловится они - в коде вижу DispatchMessage/GetMessage , но к участку стэка обращения нету кроме как записи туда сообщений! Как ещё может программа перехватывать сообщения от таймера? И как лучше ловить все сообщения окну, точнее чем?



Ранг: 117.1 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 27 августа 2007 06:48
· Личное сообщение · #2

WM_TIMER

-----
Security through obscurity is just an illusion





Ранг: 68.0 (постоянный), 6thx
Активность: 0.060
Статус: Участник

Создано: 27 августа 2007 09:58 · Поправил: Dr3d
· Личное сообщение · #3

Вот так можно переназначить функцию WndProc (В функции MyWndProc обрабатываем всё что нада, а потом вызываем WndProc, чтоб она обработала всё остальное)
// При закрытии окна вылезет сообщение с текстом "Close"


long OldWndProc;

MyWndProc(HWND hWnd, int msg, int wParam, int lParam)
{
switch (msg)
{
case WM_CLOSE:
{
MessageBoxA(0,"Close",0,0);
}
}
return CallWindowProc((FARPROC)OldWndProc, Form1->Handle, msg, wParam, lParam);
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
OldWndProc = SetWindowLong(Form1->Handle, GWL_WNDPROC, (long)MyWndProc);
}




Ранг: 10.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 27 августа 2007 10:24
· Личное сообщение · #4

"И как лучше ловить все сообщения окну, точнее чем?"
Условный бряк на SendMessage, где условием явлется хэндл окна. Очень во многих случаях срабатывает. Так же условием может быть еще и номер сообщения



Ранг: 16.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 30 августа 2007 23:49
· Личное сообщение · #5

Dr3d
Да , за код спасибо - пригодится если лоадер напишу. Но всё же непонятно как программа то отрабатывает собственно сообщения...
Если что - это BlueSoleil 5




Ранг: 68.0 (постоянный), 6thx
Активность: 0.060
Статус: Участник

Создано: 31 августа 2007 10:11
· Личное сообщение · #6

John Freeman пишет:
Но всё же непонятно как программа то отрабатывает собственно сообщения...

Как и все, в обработчике сообщений.

Адрес функции обработчика задается в структуре WNDCLASSEX
После чего регистрируется класс функцией RegisterClassEx на основе этой структуры (т.е. в момент регистрации можно узнать функцию обработчика)
И создается окно функцией CreateWindow(Ex)
Функцию обработчика сообщений можно подменить своей функцией. Код я дал выше.

На счет таймера:
Если таймер не имеет собственной функции обработки сообщений, как ты и сказал, то сообщения посылаются в обработчик окна HWND (тип сообщения WM_TIMER, в параметрах указывается ID таймера)

John Freeman пишет:
при перехвате WinMain по таймеру не вызывается

WinMain - это функция начала приложения (почти начала, отсюда идет код, написаный программером), она вызывается один раз и к обработке сообщений она отношения не имеет. Возможно ты имел в виду WndProc..



Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 31 августа 2007 13:32 · Поправил: SergX
· Личное сообщение · #7

Вот может пригодится кому...

uses Windows;
const WM_TIMER=$0113;
var mMsg: TMsg;

begin
SetTimer(0, 10001, 3*1000, nil);
while GetMessage(mMsg, 0 , 0, 0) do
begin
TranslateMessage(mMsg);
if (mMsg.message = WM_TIMER) then
begin
KillTimer(0, 10001);
MessageBox(0, PChar('Время вышло'), PChar('Сообщение'), MB_OK);
Halt(0);
end;
DispatchMessage(mMsg);
end;
end.




Ранг: 16.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 01 сентября 2007 00:06
· Личное сообщение · #8

Dr3d
Угу, перепутал. Так вот - адрес процедуры которая в структуре WNDCLASSEX я просмотрел - проблема только одна - код вызывается только ОДИН РАЗ при старте программы, дальше он даже не дёргается.
Надо смотреть конкретнее?



Ранг: 16.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 01 сентября 2007 00:08
· Личное сообщение · #9

P.S. Чего собственно я эту тему и создал...
Как выше уже писал - ловил Dispatch/TranslateMessage , один хрен - не видно чтобы к записанному в стэк сообщению что-либо обращалось. Пробовал на все подряд дворды в стеке ставить hr вплоть до последнего учитывая размер структуры сообщения.


 eXeL@B —› Вопросы новичков —› WinMain
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати