简介
Windows 消息机制是 Windows 操作系统中一种相对底层的程序设计模式,它的本质是一种事件通知机制。应用程序可以通过窗口句柄向系统发送一个消息,处理消息的窗口可以收到消息并作出相应动作。消息队列则是用来维护消息的队列数据结构。
消息类型
Windows 消息可以分为三类:系统预定义消息、应用程序自定义消息和控件通知消息。
系统预定义消息
Windows 操作系统定义了大量系统消息,他们的唯一标识为系统的常量宏定义,常用的系统消息如下:
- WM_CREATE:创建一个窗口时发出
- WM_DESTROY:当窗口被破坏时发出
- WM_CLOSE:当窗口接收到关闭命令时发出
- WM_PAINT:当一个窗口的客户区无效时发出
应用程序自定义消息
应用程序也可以定义一些自己的消息类型通过调用 RegisterWindowMessage
函数来注册一个自定义消息。
控件通知消息
控件通知消息用来告诉父窗口它正在发生的事件,比如用户在一个 Edit 控件里面输入了什么等等。
消息循环
Windows 设计程序时使用消息循环(MESSAGE LOOP)的一种机制,通过它实现不同的窗口之间相互通信。消息循环是一个无限循环,等待接受系统广播出来的消息,并根据消息类型分发到相应的窗口过程处理,如下所示:
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
消息循环分以下两个步骤:
- GetMessage:从消息队列中获取一条消息并将其从队列中删除。
- TranslateMessage 和 DispatchMessage:将消息转换为键盘和鼠标事件并将其分发到处理该类消息的函数。
消息队列
消息和消息队列的关系类似于生产者(窗口)和消费者(应用程序),其中窗口发送消息到消息队列,应用程序从消息队列获取消息并进行处理。
推荐两个示例说明:
示例1:为窗口注册自定义消息,发送并处理自定义消息
- 为窗口注册一个自定义的消息类型:
UINT customMsgId = RegisterWindowMessage(TEXT("my_custom_message"));
- 发送自定义消息:
SendMessage(hwnd, customMsgId, wParam, lParam);
- 处理自定义消息:
case WM_APP:
{
if (msg.message == customMsgId)
{
// 处理自定义消息
}
break;
}
示例2:向消息队列发送一个任务或者事件
- 获取消息队列句柄:
auto mq = CreateMessageQueue(TEXT("example_queue"), nullptr);
- 使用消息队列句柄发送消息:
MQRESULT result = MQPutMessage(mq, nullptr, (PVOID)data, size);
- 从消息队列句柄接收消息:
MQRESULT result = MQReceiveMessage(mq, INFINITE, &msgProp, pBuffer, &bufferSize, nullptr, &pAsyncToken);
以上示例说明了 Windows 消息和消息队列的基本用法,希望能帮助到您。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:windows消息和消息队列实例详解 - Python技术站