Я полагаю, что вы прекрасно себя чувствуете с простым стариком SendMessage
.Оттуда шаг к SendMessageCallback
не такой длинный.
Сначала посмотрите на
LRESULT WINAPI SendMessage(__in HWND hWnd,
__in UINT Msg,
__in WPARAM wParam,
__in LPARAM lParam);
Затем посмотрите на
BOOL WINAPI SendMessageCallback(__in HWND hWnd,
__in UINT Msg,
__in WPARAM wParam,
__in LPARAM lParam,
__in SENDASYNCPROC lpCallBack,
__in ULONG_PTR dwData);
Очевидно, что различающиесячасти - это SENDASYNCPROC
и ULONG_PTR
параметры SendMessageCallback
.
. lpCallBack
вверху есть имя вашего обратного вызова, который будет вызываться ОС, когда оконная процедура hWnd
возвращается после обработки сообщения Msg
, которое вы ему отправили.
Тип lpCallBack
равен SENDASYNCPROC
, который объявлен как
VOID CALLBACK SendAsyncProc(__in HWND hwnd,
__in UINT uMsg,
__in ULONG_PTR dwData,
__in LRESULT lResult);
dwData
вверху естьлюбые данные, которые вы хотите использовать внутри вашего обратного вызова, всякий раз, когда он вызывается.Обычно это указатель на сложные данные, такие как структура или класс C ++.В этом случае время жизни памяти должно быть тщательно продумано, чтобы оно действовало при вызове обратного вызова.dwData
также может быть простыми целочисленными данными, на которые он похож.
Тогда сведем все вместе.В вашем коде вы называете SendMessageCallback
следующим образом (проверка ошибок исключена для удобства чтения):
SendMessageCallback(hWnd, WM_FOO, 0, 0, MySendAsyncProc, (ULONG_PTR)myData);
Но, хммм, так как это упражнение, давайте предположим, что myData просто 0:
SendMessageCallback(hWnd, WM_FOO, 0, 0, MySendAsyncProc, 0);
Это означает, что вы объявили обратный вызов MySendAsyncProc
:
VOID CALLBACK MySendAsyncProc(__in HWND hwnd,
__in UINT uMsg,
__in ULONG_PTR dwData, // This is *the* 0
__in LRESULT lResult) // The result from the callee
{
// Whohoo! It called me back!
}
И этот обратный вызов будет вызван, когда ваше сообщение WM_FOO
будет обработано.
Это довольно многоэто.