Пример использования SendMessageCallback - PullRequest
3 голосов
/ 20 февраля 2011

http://msdn.microsoft.com/en-us/library/ms644951%28v=VS.85%29.aspx

Я искал повсюду, но не смог найти ни одного работающего слова о том, как это можно сделать. Кажется, есть несколько звонков, которые полностью смутили меня. Возможно, кто-то может привести небольшой пример того, как объявить этот обратный вызов, а затем отправить ему сообщение?

Спасибо

1 Ответ

9 голосов
/ 21 февраля 2011

Я полагаю, что вы прекрасно себя чувствуете с простым стариком 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 будет обработано.

Это довольно многоэто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...