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 = &param[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<MSG*>(message); //
 
        if(msg->message == WM_COPYDATA)//消息类型
        {
            COPYDATASTRUCT *data = reinterpret_cast<COPYDATASTRUCT*>(msg->lParam);
            QTextCodec *gbk = QTextCodec::codecForName("GB18030");
            QString recevice = gbk->toUnicode((char *)(data->lpData));//转码
 
            if(recevice.contains("Command="))
            {
               return true;//消息不再进行传递,不再处理
            }
 
            m_wnd = reinterpret_cast<HWND>(msg->wParam);//高地址的参数
 
        }
    }
 
    return QWidget::nativeEvent(eventType, message, result);//交给Qt处理
}
使用PostMessage发送消息用法完全一样。无论使用SendMessage还是使用PostMessage发送消息,接收函数都是nativeEvent。

QT c++ 中使用PostMessage/SendMessage实例相关推荐

  1. 在linux下Qt使用sqlite,QT中SQLite使用【实例】

    今天分享一个Qt下,使用SQLite的一个案例.QT中SQLite使用[实例] #include //#include #include #include #include #include #inc ...

  2. 详解在QT中写控制台程序 实例

    详解在QT中写控制台程序 实例 在QT中写控制台程序 实例是本文介绍的内容,不多说了,先来看本文内容. AD: 本文介绍的是详解在QT中写控制台程序 实例,来看那内容.找到两种方法可以写控制台程序 第 ...

  3. Qt TCP协议 传输简单字符串实例

    TCP协议的程序使用的是客户端/服务器模式,在Qt中提供了QTcpSocket类来编写客户端程序,使用QTcpServer类编写服务器端程序. A 转载:http://mobile.51cto.com ...

  4. Qt/E中的键盘设备管理

    转载请注明出处: http://www.cnblogs.com/baizx/ 键盘设备在Qt中表现为QWSKeyboardHandler的一个实例,为了支持各种各样的键盘设备,Qt提供了QWSKeyb ...

  5. qt如何用python结合_在Qt(C++)中与Python混合编程

    一.PythonQt库 在Qt(C++)中与Python混合编程,可以使用PythonQt库. 网站首页:http://pythonqt.sourceforge.net 下载页面:https://so ...

  6. Qt Quick 中 QML 与 C++ 混合编程详解

    Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ...

  7. Matplotlib画图教程:在QT界面中嵌入三维图片

    Matplotlib画图教程:在QT界面中嵌入三维图片 需求: 做项目报告的时候,有这么一个想法,就是能通过UI随时调用matplotlib进行二维图和三维图的绘制.因此就诞生了做这么一个小模块的想法 ...

  8. Qt4_在Qt设计师中集成自定义窗口部件

    在Qt设计师中集成自定义窗口部件 在Qt设计师中使用自定义窗口部件之前,我们必须让Qt设计师先察觉到它们的存在.有两种方法可以完成这一任务:改进法(promotion)和插件法(pluigin). 改 ...

  9. 通过PostMessage/SendMessage实现模拟键盘鼠标按键,发送不成功或出现重复按键的可参考本文

    函数原型如下: BOOL WINAPI PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); LRESULT SendMessage ...

最新文章

  1. 推荐开发工具系列之--LinrF5(自动刷新)
  2. 使用w查看系统负载、vmstat命令、top命令、sar命令、nload命令
  3. android提交服务器,Android向WEB服务器提交数据
  4. linux卸载keystone服务,关于linux下卸载apache后安装apache
  5. 怎样从red hat linux图形登录改成从文本登录
  6. 你要了解的11款面向Linux系统的一流备份实用工具
  7. java中volatile关键字的含义_Java里volatile关键字是什么意思
  8. 网络工程师和网络管理原的区别
  9. 世界500百强企业中国的CEO对我们的忠告!!!!!我们要告别稚气了
  10. python黑客帝国代码雨源代码_黑客帝国数字雨 源代码分享
  11. 游戏HTML翻翻乐,大班益智游戏翻翻乐教案
  12. 如何根据vin码查询_车架号查询-VIN查询-车辆识别码查询-宜配网
  13. 如何在Mac上解决蓝牙问题
  14. FPGA零基础学习:数字通信中的电压标准
  15. 考研—计算机网络—应用层
  16. 蓝桥杯嵌入式 - 第九届决赛试题(电子秤)
  17. 第一章 人机交互概述
  18. ​Elastic Stack最佳实践系列:Beats->ES,一个更轻型的架构选择
  19. 计算机应用 退修后正刊录用,计算机应用退修,全是格式问题,能正刊录用吗??...
  20. 从用商派Onex到SAP的hybris开发电商网站

热门文章

  1. redis存储新闻列表_Redis对象——集合(Set)
  2. 大数据面试题及答案 汇总版
  3. mysql update 行迁移_Oracle行迁移和行链接详解
  4. Java中sum和Sum相同吗,Java认为变量Sum 和sum相同。
  5. smarty.class.php,自定义min版smarty模板引擎MinSmarty.class.php文件及用法
  6. linux命令行变大,Linux命令行下'!'的8大神奇的用法!
  7. 专科生,还有未来吗?
  8. java并发计数器_浅谈java并发之计数器CountDownLatch
  9. 计算机的网络操作题,计算机网络操作题
  10. java输入流读取几行文本_Java基础笔记Day_16