Windows进程间通讯(IPC)----消息队列
消息队列
windows系统是通过消息驱动的,每移动一下鼠标,点击一下屏幕都会产生一个消息。这些消息会先被放在windows的一个系统消息队列(先进先出)中,windows系统会为每一个GUI线程创建一个线程消息队列,然后系统会从系统消息队列中取出一个消息放到对应的线程消息队列中。之后通过消息循环从线程消息队列中取出消息分发派遣到对应的窗口的窗口过程中。

线程消息队列是如何创建的
系统消息队列是由windows操作系统默认创建的,而对于普通的线程而言是没有线程消息队列的。线程刚创建时为普通线程,其KTHREAD.ServiceTable字段指向的是KerServiceDescriptorTable(SSDT)表,这个表包含的是ntoskrnl.exe服务函数,都是一些非GUI函数。如果我们在线程中调用第一个Windows的GUI函数时,线程的KTHREAD.ServiceTable字段会指向KerServiceDescriptorTable(Shadow SSDT)表,这个表不光包含ntoskrnl.exe服务函数还包含win32k.sys服务函数,后者包含了GUI函数。而且会分配空间为KTHREAD.win32Thread指针分配空间,由此指针就可以找到相应的线程消息队列。
利用消息队列进行IPC
因为线程消息队列是在内核中的,所以可以通过消息队列进行进程间通信(IPC)。当然进行进程间通讯的两个进程必须有GUI线程才行,因为只有GUI线程才有线程消息队列。
消息类型
系统保留从0x0000---0x03ff(WM_USER-1)的值用于系统定义的消息,而用户自定义消息的范围为0x0400(WM_USER)---0x7fff。
发送消息
消息队列中的消息对应一个消息结构MSG,包含了消息的各个信息。我们在利用消息进行进程间通讯时是通过WPARAM和LPARAM传递讯息的。
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
DWORD lPrivate;
} MSG, *PMSG, *NPMSG, *LPMSG;
我们可以通过SendMessage或PostMessage发送消息,但是SendMessage直接将消息发送到对应的窗口过程中并不放在消息队列里,所以我们要想通过消息队列实现IPC应该使用PostMessage。
PostMessageA可以将消息发送到窗口句柄hWnd对应的线程消息队列中,PostThreadMessageA可以将消息发送到线程句柄hThread对应的消息队列中。(这里注意hWnd窗口句柄是属于用户对象的句柄一般通过FindWindow函数获取,而hThread是内核对象的句柄一般通过跨进程共享内核对象完成)
BOOL PostMessageA(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
获取消息
获取消息有一般使用PeekMessage或GetMessage。
PeekMessage可以检索当前调用线程的线程消息队列中指定的消息,并不指定检索后如何处理线程队列中的消息(删除还是保留)。
BOOL PeekMessageA(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);
GetMessage和PeekMessage一样,只不过其会在检索到消息后直接将消息从对应的线程消息队列中删除。
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
Windows进程间通讯(IPC)----消息队列的更多相关文章
- High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载
小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...
- Android AIDL 进行进程间通讯(IPC)
编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3. ...
- QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开 本文地址:h ...
- Windows进程间通讯(IPC)----WM_COPYDATA
WM_COPYDATA通讯思路 通过向其他进程的窗口过程发送WM_COPYDATA消息可以实现进程间通讯. 只能通过SendMessage发送WM_COPYDATA消息,而不能通过PostMessag ...
- Windows进程间通讯(IPC)----共享内存
Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...
- Windows进程间通讯(IPC)----内存映射文件
内存映射文件原理 内存映射文件是通过在虚拟地址空间中预留一块区域,然后通过从磁盘中已存在的文件为其调度物理存储器,访问此虚拟内存空间就相当于访问此磁盘文件了. 内存映射文件实现过程 HANDLE hF ...
- 服务 远程服务 AIDL 进程间通讯 IPC
Activity aidl接口文件 package com.bqt.aidlservice; interface IBinderInterface { /* 更改文件后缀为[.aidl]去掉 ...
- Windows进程间通讯(IPC)----管道
管道的分类 管道其实际就是一段共享内存,只不过Windows规定需要使用I/O的形式类访问这块共享内存,管道可以分为匿名管道和命名管道. 匿名管道就是没有名字的管道,其支持单向传输数据,如果需要双向传 ...
- Windows进程间通讯(IPC)----信号量
线程同步内核对象 操作系统进行进程间同步是利用信号量机制.对于windows系统而言,可以利用一些内核对象进行线程同步,因为这些内核对象可以命名并且属于系统内核,所以可以支持不同进程间的线程同步进而实 ...
随机推荐
- 【死磕JVM】一道面试题引发的“栈帧”!!!
前言 最近小农的朋友--小勇在找工作,开年来金三银四,都想跳一跳,找个踏(gao)实(xin)点的工作,这不小勇也去面试了,不得不说,现在面试,各种底层各种原理,层出不穷,小勇就遇上了这么一道面试题, ...
- CSS盒子的尺寸
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- python网络编程TCP服务多客户端的服务端开发
#服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...
- Mac下安装lightgb并在jupyter中使用
1.先安装cmake和gcc brew install cmake brew install gcc 2.下载后确定自己的gcc版本 cd /usr/local/opt/gcc/lib/gcc/ 看到 ...
- PTA 带头结点的链式表操作集
6-2 带头结点的链式表操作集 (20 分) 本题要求实现带头结点的链式表操作集. 函数接口定义: List MakeEmpty(); Position Find( List L, Element ...
- 创建Maven父子项目以及它们的优点
此文引用:https://blog.csdn.net/zxl8876/article/details/104180133 创建maven父子项目 第一步创建父项目: 新建一个普通的maven项目 删除 ...
- 全网最详细的Linux命令系列-Find命令
Find工具实战 Find工具实战,Find工具主要用于操作系统文件.目录的查找,其语法参数格式为: find path -option [ -print ] [ -exec -ok command ...
- 2,turicreate入门 - 一个简单的回归模型
turicreate入门系列文章目录 1,turicreate入门 - jupyter & turicreate安装 2,turicreate入门 - 一个简单的回归模型 3,turicrea ...
- 扩展中国剩余定理(EXCRT)学习笔记
扩展中国剩余定理(EXCRT)学习笔记 用途 求解同余方程组 \(\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2} ...
- [hash-bfs]USACO 3.2 Magic Squares 魔板
魔 板 魔板 魔板 题目描述 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色 ...