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日

相关文章

  • Selenium+Tesseract-OCR智能识别验证码爬取网页数据的实例

    下面是详细的攻略: Selenium+Tesseract-OCR智能识别验证码爬取网页数据的实例 一、前言 爬虫在获取数据上有着很大的优势,但存在着一些限制,比如在网站登录时需要验证码,而这些验证码又必须由人工来识别,无法通过普通的XPath或CSS Selector来定位。 本文主要介绍如何使用Selenium和Tesseract-OCR结合的方式,来实现…

    人工智能概论 2023年5月25日
    00
  • tesserocr与pytesseract模块的使用方法解析

    当我们需要进行文字识别时,tesserocr和pytesseract是两个常用的Python模块。它们本质上都是封装了Google Tesseract OCR引擎的Python API,因此都能够实现图片文字的识别。接下来,我们将详细讲解这两个模块的使用方法及其区别。 Tesserocr模块 安装 在开始使用Tesserocr前,需要先安装Tesseract…

    人工智能概论 2023年5月25日
    00
  • Node.js Process对象详解

    Node.js Process对象详解 在Node.js中,process对象是一个全局变量,它提供了当前 Node.js 进程的信息以及控制该进程的方法。process对象是EventEmitter类的实例,因此,它也可以用来触发和监听事件。 process对象的常用属性 process.pid:当前进程的进程ID,类型为数字 process.versio…

    人工智能概论 2023年5月25日
    00
  • 四款截图软件测评(推荐)

    四款截图软件测评(推荐) 本篇文章将对四款常用的截图软件进行测评和推荐,分别是: Snipping Tool Greenshot LightShot Snagit 1. Snipping Tool 简介 Snipping Tool 是 Windows 操作系统自带的截图工具,不需要安装任何软件,简单易用,适合一般的截图需求。 使用方法 打开 Snipping…

    人工智能概论 2023年5月25日
    00
  • Android中dumpsys命令用法简单介绍

    Android中dumpsys命令用法简单介绍 在Android中,dumpsys是一个很常用的命令行工具,它可以用来获取系统的一些状态信息和调试信息,比如Activity、内存、服务等等。 dumpsys命令的用法 使用dumpsys命令需要在Android系统的shell环境中执行,在终端或ADB shell中运行以下命令: adb shell dump…

    人工智能概览 2023年5月25日
    00
  • redis 限制内存使用大小的实现

    Redis是一个使用内存作为数据存储方式的高性能key-value数据库。由于内存资源的限制,设置使用Redis时需要对其进行一定的内存限制,以避免Redis使用过多内存导致服务器宕机。 下面将详细讲解Redis限制内存使用大小的实现攻略。 使用maxmemory配置项 Redis提供了maxmemory配置项,用于设置Redis所使用的内存上限。该配置项的…

    人工智能概览 2023年5月25日
    00
  • SpringCloud可视化链路追踪系统Zipkin部署过程

    下面我将详细讲解“SpringCloud可视化链路追踪系统Zipkin部署过程”的完整攻略。 一、Zipkin介绍 Zipkin是一个开源的分布式跟踪系统,它可以帮助我们监控和调试微服务架构中的调用链路。Zipkin圆形对以下方面提供支持:- 请求跟踪和调用时间分析- 单个请求的耗时分析- 端到端的请求跟踪- 链路的拓扑结构分析 二、Zipkin Serve…

    人工智能概览 2023年5月25日
    00
  • c# 利用易福门振动模块VSE002采集振动数据的方法

    下面是详细讲解“c# 利用易福门振动模块VSE002采集振动数据的方法”的完整攻略。 准备工作 在实现利用易福门VSE002采集振动数据之前,需要做一些准备工作,包括以下步骤: 购买易福门振动模块VSE002,并按照说明书按照接线要求连接好。 安装易福门提供的驱动和示例程序。 安装C#编程环境,例如Visual Studio。 在C#编程环境中,添加易福门提…

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