SendMessageCallback用法示例

时间:2011-02-20 17:07:02

标签: c++ c windows winapi

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

我一直在各处搜索,但是在c中找不到一个可以做到这一点的工作。似乎有几个电话让我很困惑。也许有人可以举一个小例子来说明如何声明这个回调然后向它发布消息?

谢谢

1 个答案:

答案 0 :(得分:9)

我认为你对普通的'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的{​​{1}}和ULONG_PTR参数。

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

Msg的类型为lpCallBack,声明为

SENDASYNCPROC

VOID CALLBACK SendAsyncProc(__in HWND hwnd, __in UINT uMsg, __in ULONG_PTR dwData, __in LRESULT lResult); 只要有人调用,你就可以在回调中使用任何类型的数据。这通常是指向复杂数据的指针,如struct或C ++类。在这种情况下,必须仔细考虑内存的生命周期,以便在调用回调时它是有效的。 dwData也可以是它看起来的简单整数数据。

然后将所有这些结合在一起。在您的代码中,您可以像这样调用dwData(为了便于阅读,省略了错误检查):

SendMessageCallback

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

SendMessageCallback(hWnd, WM_FOO, 0, 0, MySendAsyncProc, (ULONG_PTR)myData);

这意味着您已声明回调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! } 消息时,将调用该回调。

这几乎总结了它。