QT c++ 中使用PostMessage/SendMessage

您所在的位置:网站首页 qt消息传递 QT c++ 中使用PostMessage/SendMessage

QT c++ 中使用PostMessage/SendMessage

2024-01-31 07:12| 来源: 网络整理| 查看: 265

 

PostMessage是Windows API(应用程序接口) 中的一个常用函数,用于将一条消息放入到消息队列中。并且不会等待响应的线程处理消息,而是直接返回。(简单的理解就是异步)。

而SendMessage作用一样,但是会等待结果返回(同步)

我们先来看PostMessage函数的原型:

BOOL WINAPI PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:

HWND_BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、 被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口

NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样

Msg:指定被寄送的消息。

wParam:指定附加的消息特定的信息。

LParam:指定附加的消息特定的信息。

返回值:如果函数调用成功,返回非零,否则函数调用返回值为零

接收的时候,使用QT5中的方法是 在接收的类中,重新实现 nativeEvent函数(Qt4的时候使用的是winEvent,从Qt5开始,就使用nativeEvent),这个方法既可以拦截系统消息,也可以拦截通过postMessage,sendMessage发送的自定义消息。

[virtual protected] bool QWidget::nativeEvent(const QByteArray &eventType, void *message, long *result);

其中:

eventType: windows平台的值就是“windows_generic_MSG”;

message: 类型为MSG*, 存储的就是PostMessage中的Msg。

Result:类型为LRESULT,返回的值。

如果返回ture:表示停止这个消息。如果返回false:这个消息就继续传递给Qt,Qt会将这个消息转变为Qt event并将它发送给响应的控件。

我们用Qt环境下来举个栗子:

先是使用SendMessage来向顶层窗口发送消息

HWND m_wnd = ::FindWindowA(("ClientMainWindow"), NULL);//通过主窗口类名寻找主窗口句柄 WId wid = this->winId(); //这个窗口的winid if (NULL != m_wnd) { std::thread th([=](){ //单独启动一个线程进行数据传递 QString command = QString("Command=ChangeCode=%1\r\n").arg(code);//传递的内容 std::string param = command.toStdString(); COPYDATASTRUCT data; //使用COPYDATA的方式进行数据传递 data.dwData = 0; data.cbData = param.length(); data.lpData = ¶m[0]; ::SendMessage(m_wnd, WM_COPYDATA, (WPARAM)wid, (LPARAM)&data); }); th.detach();//传递结束后,进行关闭线程 }

同时,在接收的顶层窗口中,重写nativeEvent函数

bool EmbededWidget::nativeEvent(const QByteArray &eventType, void *message, long *result) { if (eventType == "windows_generic_MSG") //windows平台 { MSG* msg = reinterpret_cast(message); // if(msg->message == WM_COPYDATA)//消息类型 { COPYDATASTRUCT *data = reinterpret_cast(msg->lParam); QTextCodec *gbk = QTextCodec::codecForName("GB18030"); QString recevice = gbk->toUnicode((char *)(data->lpData));//转码 if(recevice.contains("Command=")) { return true;//消息不再进行传递,不再处理 } m_wnd = reinterpret_cast(msg->wParam);//高地址的参数 } } return QWidget::nativeEvent(eventType, message, result);//交给Qt处理 }

使用PostMessage发送消息用法完全一样。无论使用SendMessage还是使用PostMessage发送消息,接收函数都是nativeEvent。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3