MFC PostMessage SendMessage

Posted ycbeginner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC PostMessage SendMessage相关的知识,希望对你有一定的参考价值。

在MFC项目中,需要用到自定义消息来传递数据,故对PostMessage,SendMessage的用法进行整理。

  • 函数定义
LRESULT SendMessage(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM IParam);

LRESULT PostMessage(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM IParam);

//hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

//wMsg:用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量.

//wParam:通常是一个与消息有关的常量值,也可能是窗口或控件的句柄

//lParam:通常是一个指向内存中数据的指针。由于WParam、lParam和Pointer都是32位的,因此,它们之间可以相互转换

//返回值指定消息处理的结果,依赖于所发送的消息。
  • 如何使用

1. 自定义消息ID

#define WM_MY_MESSAGE (WM_USER+100)        // WM_USER为windows系统为非系统消息保留的ID,这里至少要用100,因为其它控件的消息会占用一部分。

2. 定义消息处理函数

消息处理函数为消息目标类的成员函数。首先应该在.h 文件中声明。这里以主窗口类为例,主窗口类名 CMainDialog,则首先在CMainDialog.h声明消息处理函数。

protected: 
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);  //注意要有返回值,如LRESULT,其他类型也可以

3.在CMainDialog.cpp中实现消息处理函数

LPESULT CMainDialog::OnMyMessage(WPARAM wParam, LPARAM lParam) 
{ 
// TODO: 处理用户自定义消息 
... 
return 0; 
}

4.在CMainDialog.cpp中映射消息ID和消息处理函数

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) 
ON_WM_CREATE() 
ON_WM_TIMER() 
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage) 
//}}AFX_MSG_MAP 
END_MESSAGE_MAP()

5.使用PostMessage/SendMessage函数

在需要发送的数据地方,使用这两个函数传递消息就可以。下面是简单写法:(SendMessage 用法一样)

::PostMessage(GetSafeHwnd(), WM_USER_THREADEND, 0, 0); //GetSafeHwnd()表示得到当前窗口句柄,所以这条语句是发送给当前窗口
GetParent()->PostMessage(WM_USER_THREADEND, 0, 0);//发送给父窗口 
this->PostMessage(WM_USER_THREADEND, 0, 0);//发送给当前窗口
HWND h= ::FindWindow(NULL, _T("窗口名字"));
::PostMessage(h, WM_PARASET, 0, 0);//发送给任意窗口
  •  PostMessage/SendMessage区别

SendMessage:将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口过程,直到窗口过程处理完消息后才返回,阻塞式。

Postmessage:将消息放入消息队列里,并立即返回,执行后面的代码,非阻塞式。

以上是关于MFC PostMessage SendMessage的主要内容,如果未能解决你的问题,请参考以下文章

MFC SendMessage和PostMessage 区别

MFC中使用PostMessage和SendMessage函数

接收 MFC 对话框的 PostMessage 消息

MFC发送自定义消息-PostMessage和SendMessage

请问MFC中PostMessage()在此有啥作用呢?

猎豹MFC--发送消息SendMessage PostMessage