При создании окна я хочу немедленно сгенерировать событие таймера, идентификатор 1. Поэтому я использовал такую функцию SendMessage
SendMessage(hWnd, WM_TIMER, 1, (LPARAM)&timerproc);
, но она не сработала.
Обратный вызов вызывается таймером, только когда таймер сигнализирует очередь сообщений потока-владельца, чтобы сгенерировать сообщение WM_TIMER
, которое затем извлекается (Peek|Get)Message()
и передается в DispatchMessage()
циклом сообщений потока.DispatchMessage()
вызывает обратный вызов таймера, если он назначен, иначе он доставляет сообщение WM_TIMER
в WndProc окна:
Если параметр lpmsg
указывает на сообщение WM_TIMER
и параметр lParam
сообщения WM_TIMER
не NULL
, lParam
указывает на функцию, которая вызывается вместо оконной процедуры.
Использование SendMessage()
позволяет обойти окноочередь сообщений и отправляется непосредственно в WndProc окна.Вот почему вы не видите, как вызывается обратный вызов таймера.
Так что, по крайней мере, вам придется использовать PostMessage()
вместо SendMessage()
, чтобы ваше ручное сообщение WM_TIMER
могло пройтиочередь сообщений окна достигает и DispatchMessage()
:
PostMessage(hWnd, WM_TIMER, 1, (LPARAM)&timerproc);
В противном случае вам придется позвонить DispatchMessage()
напрямую с поддельной MSG
вашей собственной:
MSG msg = {};
msg.hwnd = hWnd;
msg.message = WM_TIMER;
msg.wParam = 1;
msg.lParam = (LPARAM) &timerproc;
msg.time = GetTickCount();
GetCursorPos(&msg.pt);
DispatchMessage(&msg);
Однако, это на самом деле не нужно, потому что ...
Как мне активировать timerproc справа от первого окна?
Обратный вызов - это функция, поэтомупросто вызовите его напрямую, как и любую другую функцию:
//SendMessage(hWnd, WM_TIMER, 1, (LPARAM)&MakeRain);
MakeRain(hWnd, WM_TIMER, 1, GetTickCount());