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

我一直在四处搜寻,但是无法在c中找到任何可行的方法来完成这项工作。似乎有几个电话让我完全困惑。也许有人可以举一个小例子说明如何声明此回调然后向其发布消息?

谢谢

最佳答案

我认为您对ol'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);

显而易见的是,SENDASYNCPROCULONG_PTRSendMessageCallback参数是不同的部分。

上面的lpCallBack是您的回调的名称,当处理您发送给它的hWnd消息后,Msg窗口过程返回时,操作系统将调用该回调的名称。
lpCallBack的类型是SENDASYNCPROC,它声明为
VOID CALLBACK SendAsyncProc(__in  HWND hwnd,
                            __in  UINT uMsg,
                            __in  ULONG_PTR dwData,
                            __in  LRESULT lResult);

每当调用dwData时,您都希望在回调中使用任何类型的数据。这通常是指向复杂数据的指针,例如struct或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消息后,将调用该回调。

差不多可以总结了。

10-07 15:35