想要学习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.前者就是所谓的非队列