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函数