SendMessageCallback用法示例

Mar*_*o29 3 c c++ windows winapi

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

我一直在寻找各地,但无法找到一个关于如何做到这一点的工作.似乎有几个电话让我很困惑.也许有人可以举一个小例子来说明如何声明这个回调然后向它发布消息?

谢谢

Joh*_*ell 9

我认为你对普通的OL非常满意SendMessage.从那里开始的步骤SendMessageCallback不是那么久.

首先,看看

LRESULT WINAPI SendMessage(__in  HWND hWnd,
                           __in  UINT Msg,
                           __in  WPARAM wParam,
                           __in  LPARAM lParam);
Run Code Online (Sandbox Code Playgroud)

然后看看

BOOL WINAPI SendMessageCallback(__in  HWND hWnd,
                                __in  UINT Msg,
                                __in  WPARAM wParam,
                                __in  LPARAM lParam,
                                __in  SENDASYNCPROC lpCallBack,
                                __in  ULONG_PTR dwData);
Run Code Online (Sandbox Code Playgroud)

很明显,不同的部分是SENDASYNCPROC和的ULONG_PTR参数SendMessageCallback.

lpCallBackhWnd处理Msg发送给它的消息后窗口过程返回时,操作系统将调用您的回调名称.

lpCallBackis 的类型,SENDASYNCPROC声明为

VOID CALLBACK SendAsyncProc(__in  HWND hwnd,
                            __in  UINT uMsg,
                            __in  ULONG_PTR dwData,
                            __in  LRESULT lResult);
Run Code Online (Sandbox Code Playgroud)

dwData那里是要回调中使用任何类型的数据,每当它被调用.这通常是指向复杂数据的指针,如struct或C++类.在这种情况下,必须仔细考虑内存的生命周期,以便在调用回调时它是有效的.它dwData也可以是它看起来的简单整数数据.

然后将它们全部整合在一起.在您的代码中,您可以这样调用SendMessageCallback(为了便于阅读,省略了错误检查):

SendMessageCallback(hWnd, WM_FOO, 0, 0, MySendAsyncProc, (ULONG_PTR)myData);
Run Code Online (Sandbox Code Playgroud)

但是,嗯,因为这是一个练习,让我们假设myData只是0:

SendMessageCallback(hWnd, WM_FOO, 0, 0, MySendAsyncProc, 0);
Run Code Online (Sandbox Code Playgroud)

这意味着你已经声明了一个回调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!
}
Run Code Online (Sandbox Code Playgroud)

当您的WM_FOO消息被处理完毕后,将调用该回调.

这几乎总结了它.