Qt开发:Windows 下进程间通信的可行桥梁:窗体消息SendMessage
Qt开发:Windows 下进程间通信的可行桥梁:窗体消息
注:窗体消息仅适用于有窗口的进程,如果没有窗口是无法收到窗体消息的(哪怕是隐形的都可以),比如Qt中如果需要使用WindowsMessage只需要类继承QWidget或者QMainWindow等窗口即可。
在说起如何使用Qt窗体消息,我们先要说说窗体消息到底是什么。
如果你有看过一本书叫做Windows高级编程,那下面的内容应该都不用看了,我这里就简单概述一下窗体消息。
在Windows下的应用程序中,其实我们可以很简单地发现,一般的应用程序都是点开之后有一个窗口,然后可以对窗口进行一些操作,或者对一些控件,进行一点比如点击、拖拽、双击等操作。如果你是一名开发,你会很自然地注意到Qt中有一些比如enterEvent,leaveEvent,clickEvent类似的函数。你有没有想过,为什么你的点击事件会在Qt中获得一个触发呢?难道是一种魔法吗?
当然不是的,其实这一切都是来自于Windows自带的窗体消息,如果你想更进一步了解关于Windows是如何定义窗口类的,欢迎你自己去看MSDN窗口类(窗口和消息),这里有更详尽的说明。我在这里简单地说:就是Windows底层会有一个消息机制,当你对这个窗口做比如点击、拖动、双击、右键等操作,这个窗口的指定函数都会接收到特定的窗体消息信号。
我们可以来看一下这个函数
LRESULT SendMessage(
[in] HWND hWnd, //指定的窗口句柄,这个是窗口的唯一标识
[in] UINT Msg, //发送的消息类型,通过一个int值来进行区分
[in] WPARAM wParam, //指定附加的消息特定的信息。
[in] LPARAM lParam //指定附加的消息特定的信息。一般的来说自定义消息wPram和lParam自己定义就好,不做强制要求
);
也就是说,一般情况下,一个窗体消息都包括以上四个参数。我们可以看到,不同的事件通过这个Msg来区分,让我们来看一下Windows内常用的内部指令有哪些
//Msg常用值
#DeFine WM_LBUTTONDOWN 0x201 按下鼠标左键
#DeFine WM_LBUTTONUP 0x202 释放鼠标左键
#DeFine WM_LBUTTONDBLCLK 0x203 双击鼠标左键
#DeFine WM_RBUTTONDOWN 0x204 按下鼠标右键
#DeFine WM_RBUTTONUP 0x205 释放鼠标右键
#DeFine WM_RBUTTONDBLCLK 0x206 双击鼠标右键
#DeFine WM_MBUTTONDOWN 0x207 按下鼠标中键
#DeFine WM_MBUTTONUP 0x208 释放鼠标中键
#DeFine WM_MBUTTONDBLCLK 0x209 双击鼠标中键
怎么样?这样就懂了吧,大部分窗体的信号传递都是通过Windows提供的这个窗体消息来实现的,比如你现在想让这个窗体被按下鼠标左键,你就给他发这个
#DeFine WM_LBUTTONDOWN 0x201
消息就行了,它就会知道,哦现在我要被点击了,然后根据事件自动地触发一些你的函数。
那问题来了,这个窗体消息和我们的进程间通信有什么关系呢?
其实聪明的你发现了,这个窗体消息既然可以传递事件,那是不是也可以用来传递信息呢?它真的好温柔,甚至还给了wParam和lParam来给我放信息。
其实每个窗口都有一个接受窗体消息的虚函数,从父类继承的,在Qt中就是从QWidget或者QMainWindow继承的
nativeEvent(const QByteArray &eventType, void *message, long *result)
在这个函数中处理有关windows窗体消息。这个窗口接收到的每个窗体消息都会进入到nativeEvent函数体内,然后我们可以根据接收到的Msg来区分不同消息码的类型。
比如我要区分这个事件是来自进程A的,那个事件是来自进程B的,我想要把他们区分出来不同消息吗不同处理,避免混淆,我们可以来给出一个实例
//注意,所有的自定义消息码都应该从 WM_USER = 0x400开始,所有小于0x400的消息码都是Windows的系统消息,如果要占用的话可能会导致一些意料之外的错误
const int qint32 WM_EVENT_A = WM_USER + 1024; //A的事件的消息码
const int qint32 WM_EVENT_B = WM_USER + 1025; //B的事件的消息码
bool OpenGLWidget::nativeEvent(const QByteArray &eventType, void *message, long *result){
qQ_UNUSED(eventType);
MSG *msg = static_cast<MSG*>(message); //类型转换
if (eventType == "windows_generic_MSG") //windows平台
{
MSG* msg = reinterpret_cast<MSG*>(message); //
if(msg->message == WM_EVENT_A)//来自A进程的消息
{
function_about_a();
}else if(msg->message == WM_EVENT_B) //来自B进程的消息
{
function_about_b();
}
}
return QWidget::nativeEvent(eventType, message, result);//交给Qt处理
}
这样你应该明白什么是窗体消息了吧,明白了什么是窗体消息,那么发送消息想必对你来说也非常简单了吧,我这里简单给出一个实例:
::SendMessage(m_wnd, WM_COPYDATA, (WPARAM)wid, (LPARAM)&data);
::PostMessage(m_wnd, WM_COPYDATA, (WPARAM)wid, (LPARAM)&data);
最后提一嘴,在Qt中如果需要知道窗口句柄,是通过winId()来执行的,比如我现在想知道我当前这个类指代的窗口的句柄,就通过this->winId()来获得,某个窗口就用某个窗口指针的这个函数就可以返回了。
Qt开发:Windows 下进程间通信的可行桥梁:窗体消息SendMessage的更多相关文章
- 【应用笔记】【AN005】Qt开发环境下基于RS485的4-20mA电流采集
简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍在Qt开发环境下基于RS485实现4-20mA电流采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成 ...
- QT在windows下的安装与配置
先了解Qt: Qt一直以来,分为商业.开源两个版本,商业版本为用户提供了二级制的动态库,直接安装既可以使用,但是需要花钱购买license,而开源版本则遵守GPL协议,提供了源码,用户需要自行编译,才 ...
- qt在windows下的udp通信(最简单)
qt编程:windows下的udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:win7 开发环境:qt 功能: 用udp进行收发 ...
- 【Qt开发】Qt在Windows下的三种编程环境搭建
从QT官网可以得知其支持的平台.编译器和调试器的信息如图所示: http://qt-project.org/doc/qtcreator-3.0/creator-debugger-engines.htm ...
- 【QT开发】QT在windows下的exe应用程序如何在别人的电脑上直接运行
当你利用QT编译了一个可执行程序,需要将这个可执行程序拷贝到别人的电脑上运行,这个时候除了这个可执行程序外,还需要支持的库才可用运行.一般来说通过下面的方法可以实现. 首先,需要看你用的是什 ...
- windows下进程间通信(转)
摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microsof ...
- windows下进程间通信的(13种方法)
转自:http://blog.csdn.NET/shiqz/article/details/5862936 摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进 ...
- windows下进程间通信方法
摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microsof ...
- Windows下进程间通信及数据共享
进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成. 多进程/多线程是Windows操作系统的一个基本特征.Microsoft W ...
- Qt在Windows下的三种编程环境搭建
尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/17363165 从QT官网可以得知其支持的平台.编译器 ...
随机推荐
- 工厂想采购一套信息化生产执行系统mes,不知道用哪家比较好?
好的信息化生产执行系统MES多的是,但是否适用于贵工厂那就不得而知了,要知道,不同行业.不同产品.不同规模的工厂用同一套系统效果呈现出来都不一样的,所以匹配很重要,个性化差异化.变化性等决定了一个工厂 ...
- 实现fastdfs防盗链功能
目录 1.背景 2.实现原理 2.1 开启防盗链 2.2 重启 nginx 2.3 Java代码生成token 1.token生成规则 2.java生成token 3.测试 3.1 带正确token访 ...
- 详解ROMA Connect API 流控实现技术
摘要:本文将详细描述API Gateway流控实现,揭开高性能秒级流控的技术细节. 1.概述 ROMA平台的核心系统ROMA Connect源自华为流程IT的集成平台,在华为内部有超过15年的企业业务 ...
- 学习ASP.NET Core Blazor编程系列六——新增图书(上)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- getColumnName 和 getColumnLabel 的区别
select id as user from * getColumnName返回:"id" getColumnLabel 返回:"user"
- Vue学习之--------el与data的两种写法、MVVM模型、数据代理(2022/7/5)
文章目录 1.el与data的两种写法 1.1.基础知识 1.2.代码实例 1.3.页面效果 2.MVVM模型 2.1. 基础知识 2.2 .代码实例 2.3.页面效果 3.数据代理 3.1. 基础知 ...
- 1.Python面向对象基础
面向对象(OOP) 面向对象编程--object oriented programming 简写 OOP 面向过程和面向对象的区别: 面向过程: 1.把完成某一个需求的所有步骤从头到尾逐步实现 2 ...
- 基于JESD204B和PCIe DMA的多通道数据采集和回放系统
基于JESD204B和PCIe DMA的多通道数据采集和回放系统 在主机端PCIe驱动的控制和调度下,数据采集与回放系统可以同时完成对多个JESD204B接口AD数据的采集以及JESD204B接口DA ...
- JavaScript之数组高阶API—reduce()
一文搞懂JavaScript数组中最难的数组API--reduce() 前面我们讲了数组的一些基本方法,今天给大家讲一下数组的reduce(),它是数组里面非常重要也是比较难的函数,那么这篇文章就好好 ...
- 通过jmeter,造50个单位的并发用户数据(用户从上至下每50个单位依次排序)
单位数据:loginfoll.csv #50个单位的信息(agencyCode,passwd,agencyname,rgcode) 用户数据:50个单位,每个单位200个用户(用户名为 ...