Windows编程入门-Windows消息机制

Windows消息机制是由消息队列、消息循环、消息处理(窗口处理过程)三部分组成。
1、消息队列
Windows为所有消息维护着一个系统消息队列,而对于每个应用程序的GUI线程,系统又将会创建一个对应的消息队列。Windows根据消息结构的内容将不同的消息发送给相应GUI线程的消息队列。GUI线程通过消息循环获取并分发消息到某个指定的窗口。
注意:每个UI线程一个消息队列,而不是每个窗口一个消息队列,只有当一个线程调用Win32 API中的GDI(Graphics Device Interface)和User函数时,操作系统才会将其看成是一个GUI线程,并为它创建一个消息队列。
2、消息循环
通过Windows消息循环机制,应用程序能从消息队列中检索消息,再把他们分发个适当的窗口机进行处理。然后再检索再分发等。示例代码如下:
//	消息循环
	while (GetMessage(&msg, NULL, 0, 0))  //从消息队列获取消息,当获取到WM_QUIT消息时退出消息循环
	{
//翻译消息(将虚拟按键消息转换成字符消息,然后再把字符消息发送到调用线程的消息队列等待下次GetMessage或者PeekMessage函数取出)
		TranslateMessage(&msg);
//分发消息(将消息分发到窗口处理函数)
		DispatchMessage(&msg);
	}
GetMessage函数定义如下:
BOOL WINAPI GetMessage(
_Out_ LPMSG lpMsg, //从线程消息队列中接收消息的MSG结构体指针
_In_opt_ HWND hWnd, //指定获取哪个窗口的消息,窗口句柄必须属于该线程
_In_ UINT wMsgFilterMin, //指定获取消息的最小值
_In_ UINT wMsgFilterMax //获取消息的最大值
);
消息循环以GetMessage函数调用开始,它从线程消息队列中取出一个消息,当取出的消息为WM_QUIT(退出消息)。消息循环和应用程序退出。TranslateMessage函数将键盘按键的虚拟码转换为ASCII码,同时将WM_CHAR消息发送到消息队列中。DispatchMessage函数将消息转发给Windows操作系统来调用相应窗口的处理过程。如果消息队列为空,应用程序就将控制权交还给Windows。如果有需要控制权的应用程序,Windows就将控制权转交给应用程序。这种控制权的交换使得Windows成为多任务的操作系统。
3、消息处理(窗口处理过程)
窗口处理过程是用来接收传递给窗口的消息,它的任务就是获取消息,然后响应消息。任何一个窗口类都有一个窗口处理过程。同一个类的窗口使用同样的窗口过程来相应消息。窗口处理过程是一个回调函数(Callback Function),它是由Windows操作系统负责调用的,而应用程序本身不能调用它。消息的处理是由窗口过程完成的,窗口处理过程处理了一个消息后,通常要返回一个值给Windows。系统发送消息给窗口处理过程,通常将消息数据作为参数传递给它。消息到来之后,窗口处理过程按照消息类型的排序进行处理,其中的参数则用来区分不同的消息。同时,窗口处理过程使用参数产生合适的行为。
窗口处理过程示例代码:
//消息处理函数处理消息
LRESULT CALLBACK MyWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
case WM_PAINT:  
OnPaint();  //处理窗口绘制
return 0;
	case WM_DESTROY:
		PostQuitMessage(0); // 发送WM_QUIT消息
		return 0;
default:
return DefWindowProc(hwnd, message, wParam, lParam);  //其他消息交给系统处理
	}
}




Windows的操作会产生大量的不同种类的消息,窗口处理函数不可能处理所有的消息,只处理需要的消息,其他的消息就交给系统处理。DefWindowProc就是系统提供的消息处理过程。
本文参考 《深入分析Windows消息机制》论文
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值