windows消息和消息队列实例详解

简介

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);
}

消息循环分以下两个步骤:

  1. GetMessage:从消息队列中获取一条消息并将其从队列中删除。
  2. TranslateMessage 和 DispatchMessage:将消息转换为键盘和鼠标事件并将其分发到处理该类消息的函数。

消息队列

消息和消息队列的关系类似于生产者(窗口)和消费者(应用程序),其中窗口发送消息到消息队列,应用程序从消息队列获取消息并进行处理。

推荐两个示例说明:

示例1:为窗口注册自定义消息,发送并处理自定义消息

  1. 为窗口注册一个自定义的消息类型:
UINT customMsgId = RegisterWindowMessage(TEXT("my_custom_message"));
  1. 发送自定义消息:
SendMessage(hwnd, customMsgId, wParam, lParam);
  1. 处理自定义消息:
case WM_APP:
{
    if (msg.message == customMsgId)
    {
        // 处理自定义消息
    }
    break;
}

示例2:向消息队列发送一个任务或者事件

  1. 获取消息队列句柄:
auto mq = CreateMessageQueue(TEXT("example_queue"), nullptr);
  1. 使用消息队列句柄发送消息:
MQRESULT result = MQPutMessage(mq, nullptr, (PVOID)data, size);
  1. 从消息队列句柄接收消息:
MQRESULT result = MQReceiveMessage(mq, INFINITE, &msgProp, pBuffer, &bufferSize, nullptr, &pAsyncToken);

以上示例说明了 Windows 消息和消息队列的基本用法,希望能帮助到您。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:windows消息和消息队列实例详解 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 基于Python检测动态物体颜色过程解析

    基于Python检测动态物体颜色过程解析 前言 本攻略将介绍如何利用Python对动态物体颜色进行检测的过程。本攻略不涉及详细的Python基础知识讲解,假定读者已经对Python语法和OpenCV图像处理库有一定的了解。 目标 通过本攻略,读者将能够学习到:- 如何读取视频文件- 如何对视频中的帧进行处理- 如何使用HSV颜色空间进行检测- 如何利用形态学…

    人工智能概论 2023年5月24日
    00
  • 如何利用nginx处理DDOS进行系统优化详解

    如何利用Nginx处理DDOS进行系统优化详解 DDOS攻击,全称为分布式拒绝服务攻击,是指攻击者利用大量计算机或设备,通过特定的手段攻击目标服务器,使其无法正常工作,导致服务不可用。为了防范DDOS攻击,我们可以利用Nginx来进行系统优化。 配置Nginx限制连接速率 在Nginx配置文件中,我们可以通过配置limit_conn和limit_req模块来…

    人工智能概览 2023年5月25日
    00
  • window下安装配置mongodb的教程图解

    下面是”window下安装配置mongodb的教程图解”的完整攻略,过程中包含两条示例: 1. 下载MongoDB 首先,我们需要到官方网站 https://www.mongodb.com/ 中找到下载页面。 在下载页面中,我们可以下载适合自己系统的 MongoDB 安装包。 2. 安装MongoDB 双击安装包,开始安装 MongoDB。 选择安装目录。这…

    人工智能概览 2023年5月25日
    00
  • Python下应用opencv 实现人脸检测功能

    Python下应用OpenCV实现人脸检测功能 前言 OpenCV是计算机视觉领域中一个非常常用且广受欢迎的开源库,它提供了丰富的算法和工具函数,可以帮助我们快速搭建计算机视觉应用。其中,人脸检测功能是一个十分实用的应用领域,可以用于人脸识别、智能安防等领域。 本篇文章将会介绍如何使用Python下的OpenCV库,通过自带的分类器实现人脸检测的功能。 安装…

    人工智能概览 2023年5月25日
    00
  • Python实现字符串逆序输出功能示例

    实现字符串逆序输出是Python中非常基础的操作。下面我会提供两种示例,来详细讲解如何使用Python实现这个功能。 示例一 第一种方法是使用Python内置的slice(切片)方法。代码如下: string = "hello world" reversed_string = string[::-1] print(reversed_str…

    人工智能概览 2023年5月25日
    00
  • django使用graphql的实例

    下面我将对“django使用graphql的实例”的完整攻略进行详细讲解。 什么是GraphQL GraphQL是一种用于API的查询语言,与REST等传统的API相比,它有以下优点: 可以精确地请求所需的数据,避免了传统API请求大量不需要的数据 支持多个查询和变更操作的批量请求 可以通过类型系统和查询架构自动文档化查询 Django中使用GraphQL的…

    人工智能概论 2023年5月25日
    00
  • 最详细的python工具Anaconda+Pycharm安装教程

    Anaconda+Pycharm安装详细教程 Anaconda是一个用于科学计算的Python发行版,它包含了众多常用的科学计算库并且能够方便地安装和管理它们。而Pycharm则是一款高效的Python集成开发环境(IDE),具有丰富的功能和易用性。本文将详细介绍如何安装Anaconda和Pycharm并进行配置。 安装Anaconda 步骤一:下载Anac…

    人工智能概览 2023年5月25日
    00
  • 基于Django URL传参 FORM表单传数据 get post的用法实例

    那我就给您一份详细的攻略介绍一下如何基于Django实现URL传参、FORM表单传数据、GET和POST请求的用法实例。 使用URL传参 在Django Web应用程序中,URL传参是一种非常常见的方式,它允许我们通过URL将参数传递给视图函数,从而根据参数的不同展示不同的页面内容。 首先,我们需要在urls.py中设置好参数传递的规则。例如: from d…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部