1. 发送消息:SendMessage(WinAPI)
WINUSERAPI
LRESULT
WINAPI
SendMessageA(
__in HWND hWnd,
__in UINT Msg,
__in WPARAM wParam,
__in LPARAM lParam);
WINUSERAPI
LRESULT // 返回值,长整形
WINAPI
SendMessageW(
__in HWND hWnd, //接受消息的进程的句柄
__in UINT Msg, // 消息类型,如WM_COPYDATA、WM_USER
__in WPARAM wParam, // 下面讲
__in LPARAM lParam); // 下面讲
#ifdef UNICODE
#define SendMessage SendMessageW
#else
#define SendMessage SendMessageA
#endif // !UNICODE
在Windows的消息函数中,有两个非常熟悉的参数:wParam,lParam。这两个参数的字面意义对于现在的程序来说已经不重要了,因为它是16位系统的产物,为了保持程序的可移植性,就将它保存了下来。它的字面意义,w表示word,l表示long,对于32为系统来说,分别是无符号整数(unsigned int)和长整型(long),都是32位整数。所以,根据具体的消息解析参数即可,不用在乎其字面意义了。
//下面是Windows的定义/* Types use for passing & returning polymorphic values */
typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;
//下面是32位程序的宏定义
typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
typedef _W64 long LONG_PTR, *PLONG_PTR;
提到SendMessage就不得不提一下PostMessage,同样是发消息,那两者有什么区别呢?
最大的区别就是SendMessage是同步的,会把消息发送到应用程序消息队列中并等待其处理完返回,而PostMessage是异步的,将消息发出去后就不管了,继续下面的代码,故消息存在没处理或丢失的风险。
2. Qt中处理自定义消息:(前提是开启了事件循环QEventLoop)
方式一:nativeEventFilter
使用installNativeEventFilter注册自定义事件过滤器,继承QAbstractNativeEventFilter实现nativeEventFilter方法以实现自定义事件过滤器。
看下两个方法的定义:
//QCoreApplicati