深入理解win32消息机制

本文深入探讨了Win32程序设计中的消息机制,解析了消息如何从输入设备经过驱动程序传递到操作系统,再到应用程序的过程。重点介绍了消息结构体、消息队列、GetMessage循环以及非队列消息和队列消息的区别。通过实例代码和分析,揭示了系统调用窗口过程的必要性,强调理解消息机制对编写高效程序的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想要学习win32程序设计,消息机制必须深刻的理解的。这是所有win32程序的基石。

下面只是我学习和复习过程中的笔记加上自己的总结,谈不上原创。只为方便他人学习,也为方便自己复习。

一图胜千言,下面是截取侯捷的《深入浅出MFC》一书的一张图,画的很是通俗易懂,所以就直接粘了过来。



关于这幅图的解释:
首先是鼠标,键盘这些输入设备通过各自的驱动程序把消息传送给操作系统,操作系统会把这些消息放到一个系统的消息队列中,当然这些消息不不会是属于一个应用程序的,而是所有的消息都会放到这个系统的大队列消息中。


然后操作系统会把System message queue中的消息投递到相应的应用程序的消息队列中。那么系统是根据什么把System message queue中的消息投递到对应的应用程序消息队列中呢?下面我们来看消息的结构体是如何定义的
typedef struct tagMSG{
            HWND hwnd;                  //窗口句柄(索引内存当中的资源)
            UINT(无符号整型)  message;
            WPARAM(整型) wParam;  //关于消息的附加参数,例如:按下一个键,具体是哪个按键
            LPARAM(整型) LParam;     //关于消息的附加参数
            DWORD(32位整数) time;   //消息被传递时候的时间
            POINT(坐标结构体) pt;      //消息被传递时候,光标在屏幕上的位置
} MSG;
消息结构体的第一个参数就是一个句柄,想必你应该知道我们的程序是通过句柄来标示每一个窗口的。没错,操作系统就是根据消息结构中的这个句柄把消息投递到相应的应用程序的。


除了鼠标和键盘的消息,还有一种消息是不经过System message queue。而是通过调用
PostMessage()函数直接发送到应用程序的消息队列。
好了,这些都是系统帮助我们完成的,我们看不见也触及不到,只能够做深入的理解。了解消息机制的目的还是为了更好的写出程序来。
图中右边的模块就是我们能够控制的程序部分。我们的应用程序就是通过
while(GetMessage(&msg))
这个循环来取得消息的。这里的消息来源有两部分,从图中也可以看出这些消息可以来自System message queue,当然大部分还是来自Application message queue.前者就是所谓的非队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值