深入理解和实现Windows进程间通信(消息队列)

深入理解和实现Windows进程间通信(消息队列)

常见的进程间通信方法

常见的进程间通信方法有:

管道(Pipe)

消息队列

共享内存

信号量

套接字

下面,我们将详细介绍消息队列的原理以及具体实现。

什么是消息队列?

Windows操作系统使用消息机制来促进应用程序与操作系统之间的通信。每当发生事件(如键盘按键、鼠标移动或系统事件)时,操作系统都会生成相应的消息。这些消息被发送到一个特定的消息队列中,随后由应用程序的消息循环处理。

消息队列

每个创建了窗口的线程都拥有一个消息队列,用于存储等待处理的消息。这些消息包括用户动作(如鼠标点击、键盘操作)和系统通知(如窗口重绘请求、系统关闭通知)。

消息循环

线程通过一个循环机制,称为消息循环或消息泵,从其消息队列中检索消息。消息循环的基本操作包括:

检索消息:使用GetMessage或PeekMessage。

翻译消息:TranslateMessage转换键盘输入。

分发消息:DispatchMessage将消息派发给目标窗口的窗口过程。

消息分类

消息主要包含:

系统消息:涉及窗口生命周期管理,如WM_CLOSE和WM_QUIT等。

硬件消息:反映用户与硬件的交互,如WM_KEYDOWN和WM_MOUSEMOVE等。

除了上面提到的消息外,用户还可以自定义消息,自定义消息一般从WM_USER(0x0400)开始,到0x7FFF这样一个范围内,比如:#define WM_CUSTOM_MSG WM_USER+100

接口介绍

GetMessage、PeekMessage、SendMessage、PostMessage这四个接口是Windows消息处理的核心,它们各自承担着不同的角色和功能。

GetMessage

原型

BOOL GetMessage(

LPMSG lpMsg,

HWND hWnd,

UINT wMsgFilterMin,

UINT wMsgFilterMax

);

参数解释

lpMsg:指向MSG结构的指针,该结构将接收消息的详细信息。

hWnd:指定窗口的句柄,如果为NULL,则接收属于调用线程的任何窗口的消息。

wMsgFilterMin和wMsgFilterMax:指定要检索的消息范围的最小值和最大值。如果两者都为0,函数将返回所有可用的消息。

功能和特点

GetMessage用于从调用线程的消息队列中检索消息。该函数在有消息到达时返回,如果遇到退出消息WM_QUIT,则返回FALSE。

该函数是阻塞的,如果没有消息,它会等待消息的到来。

PeekMessage

原型

BOOL PeekMessage(

LPMSG lpMsg,

HWND hWnd,

UINT wMsgFilterMin,

UINT wMsgFilterMax,

UINT wRemoveMsg

);

参数解释

lpMsg:指向MSG结构的指针,该结构将接收消息的详细信息。

hWnd:指定窗口的句柄,如果为NULL,则获取属于调用线程的任何窗口的消息。

wMsgFilterMin和wMsgFilterMax:指定要检索的消息范围的最小值和最大值。

wRemoveMsg:指定消息如何处理。常用值有:PM_REMOVE、PM_NOREMOVE。

功能和特点

PeekMessage用于非阻塞地检查调用线程的消息队列,允许你查看消息队列中的消息而不必移除它。

可以配置为从队列中移除消息或仅检查消息而不移除。

常用于动画或游戏编程中,确保应用程序保持响应用户操作,同时继续进行其它处理。

SendMessage

原型

LRESULT SendMessage(

HWND hWnd,

UINT Msg,

WPARAM wParam,

LPARAM lParam

);

参数解释

hWnd:接收消息的窗口的句柄。

Msg:消息的标识符。

wParam 和 lParam:消息特定的附加信息。

功能和特点

SendMessage同步发送消息,调用方在接收窗口处理该消息之前会阻塞。

可用于发送任何类型的消息,并且

相关推荐

加州清光.极 刀帐语音
365bet中文网

加州清光.极 刀帐语音

📅 06-28 👁️ 5810
加州清光.极 刀帐语音
365bet中文网

加州清光.极 刀帐语音

📅 06-28 👁️ 5810
装饰画大师有哪些
365bet中文网

装饰画大师有哪些

📅 06-28 👁️ 3839