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官网可以得知其支持的平台.编译器 ...
随机推荐
- R及R Studio下载安装教程(超详细)
R 语言是为数学研究工作者设计的一种数学编程语言,主要用于统计分析.绘图.数据挖掘. 如果你是一个计算机程序的初学者并且急切地想了解计算机的通用编程,R 语言不是一个很理想的选择,可以选择 Pytho ...
- 220726 T2 Multisets (思维)
题目描述 我们说一个可重集 AA 比可重集 BB 小,当且仅当对于两个可重集中出现次数不同的最小元素 xx ,元素 xx 在 AA 中出现次数更多. 例如,可重集 {1,2,3}1,2,3 就比可重集 ...
- Docker Private Registry
Docker Private Registry 目录 Docker Private Registry Docker Registry Docker Private Registry 使用docker- ...
- 一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.分布式架构下,Session共享有什么方案 2.简述你对RPC.RMI的理解 3.分布式id生成方案 4.分布式锁解决 ...
- 学习笔记之——C语言 函数
采用函数的原因: 随着程序规模的变大,产生了以下问题: --main函数变得相当冗杂 --程序复杂度不断提高 --代码前后关联度提高,修改代码往往牵一发而动全身 --变量使用过多,命名都成了问题 -- ...
- Windows7下驱动开发与调试体系构建——0.概述
本文集内容为windows7x64下驱动开发与调试体系构建,内容目录如下: 1.驱动开发的环境准备 2.R3与R0的通信示例 3.自建调试体系概述 4.在x64下使用汇编代码 5.实战反调试标记位(N ...
- ThreadPoolExecutor BlockingQueue讲解
有四种常用阻塞队列策略: 1.直接拒绝:(Direct Handoffs) 一个好的工作队列应该是不缓存任务,而是直接交给线程处理,就如SynchronousQueue一样.一个任务将会入队失败,如果 ...
- python 爬虫 TCL SSL 安全证书问题
其实很复杂 但也很简单 只需要在requests爬虫编写前 加上这句话 requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'DH+AES:RS ...
- docker构建容器时 容器内使用代理
build 容器时 使用代理 demo1 使用前 指定 env 使用后 记得 清空, 否则 会影响 使用容器 时的 网络 cat dockerfile --> FROM jenkins/jenk ...
- Node.js 的学习(四)分别连接MongoDB与MySQL数据库,实现增删查改功能
一.Node.js 访问MongoDB 数据库 MongoDB 对许多平台都提供驱动可以访问数据库,如C#.Java.Node.js等. 1.1.安装MongoDB访问驱动 命令如下: 全局安装驱动: ...