Windows消息传递机制详解

yizhihongxing

Windows消息传递机制详解

简介

Windows消息传递机制是Windows操作系统中的一种重要的机制,它是应用程序之间通信的重要手段。本文将详细讲解Windows消息传递机制的核心概念、消息类型以及如何使用消息传递机制进行应用程序之间的通信。

核心概念

在Windows操作系统中,一个应用程序可以同时运行多个窗口,每个窗口都有一个唯一的标识符,称为窗口句柄。消息传递机制是通过向指定的窗口句柄发送消息来实现进程之间通信的。

一个消息包含了消息类型、消息参数以及消息目标(即接收消息的窗口句柄)。Windows操作系统定义了大量的消息类型,包括用户输入事件、系统事件、窗口事件等等。

消息类型

Windows操作系统定义了大量的消息类型,以下是部分常用的消息类型:

  • WM_CREATE:当一个新的窗口被创建时发送给窗口。
  • WM_DESTROY:当一个窗口被销毁时发送给窗口。
  • WM_PAINT:绘制消息,通知窗口需要重绘。
  • WM_KEYDOWN:当用户按下键盘上的键时发送给窗口。
  • WM_MOUSEMOVE:鼠标移动消息,当鼠标在窗口内移动时发送。

如何使用消息传递机制

一个应用程序可以通过API函数SendMessage或PostMessage来发送消息。SendMessage函数会在发送消息后等待消息处理完毕,而PostMessage函数则不会等待。

以下是一个使用PostMessage函数向指定窗口发送消息的示例:

HWND hwndTarget; // 指向目标窗口的句柄

// 向目标窗口发送WM_APP消息
PostMessage(hwndTarget, WM_APP, 0, 0);

以下是一个使用消息循环接收并处理消息的示例:

while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

在以上示例中,GetMessage函数用于从消息队列中获取消息,TranslateMessage和DispatchMessage函数则用于将消息转换成相应的操作系统事件并进行处理。

示例

以下是一个简单的示例,演示如何使用消息传递机制实现两个窗口之间的通信。

#include <Windows.h>

// 窗口1的消息处理函数
LRESULT CALLBACK WndProc1(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    switch (msg) {
        case WM_LBUTTONUP:
            // 向窗口2发送WM_APP消息
            PostMessage(hwnd2, WM_APP, 0, 0);
            break;
        case WM_CLOSE:
            DestroyWindow(hwnd1);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, msg, wp, lp);
    }

    return 0;
}

// 窗口2的消息处理函数
LRESULT CALLBACK WndProc2(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    switch (msg) {
        case WM_APP:
            MessageBox(NULL, "收到窗口1的消息", "消息通知", MB_OK);
            break;
        default:
            return DefWindowProc(hwnd, msg, wp, lp);
    }

    return 0;
}

// 应用程序入口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // 创建窗口类1
    WNDCLASS wc1 = {0};
    wc1.lpfnWndProc = WndProc1;
    wc1.hInstance = hInstance;
    wc1.lpszClassName = "Window1";

    RegisterClass(&wc1);

    // 创建窗口1
    HWND hwnd1 = CreateWindow("Window1", "窗口1", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
        NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd1, nCmdShow);
    UpdateWindow(hwnd1);

    // 创建窗口类2
    WNDCLASS wc2 = {0};
    wc2.lpfnWndProc = WndProc2;
    wc2.hInstance = hInstance;
    wc2.lpszClassName = "Window2";

    RegisterClass(&wc2);

    // 创建窗口2
    HWND hwnd2 = CreateWindow("Window2", "窗口2", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
        NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd2, nCmdShow);
    UpdateWindow(hwnd2);

    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

在以上示例中,我们创建了两个窗口,分别是窗口1和窗口2。当用户在窗口1内单击鼠标左键时,窗口1会向窗口2发送一个WM_APP消息。窗口2在接收到该消息后,会弹出一个消息框提示用户收到了来自窗口1的消息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Windows消息传递机制详解 - Python技术站

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

相关文章

  • 小个头也有大学问 板卡电容本质大揭秘

    小个头也有大学问:板卡电容本质大揭秘 什么是电容 电容是一种储存电荷的设备,通常由两个金属板和在两板之间的绝缘介质组成。 在计算机板卡中,电容将电能转变成电场,起到稳定电压和电流的作用。 板卡电容的种类 常见的板卡电容有: 固态电容:由固态电解质和导电聚合物构成。具有寿命长、温度稳定性高等特点,但价格相对较贵。 陶瓷电容:由陶瓷材料制成。具有寿命长、抗干扰性…

    人工智能概览 2023年5月25日
    00
  • 利用mongodb查询某坐标是否在规定多边形区域内的方法

    要利用mongodb查询某坐标是否在规定多边形区域内,需要使用mongodb的地理空间功能。在mongodb中,我们可以将地理空间数据存储为GeoJSON格式,针对该格式的数据有丰富的地理空间查询功能。下面是实现步骤: 定义地理位置字段 在mongodb中,使用GeoJSON格式来表示地理位置数据。所以,在数据表中要定义一个字段专门存储GeoJSON格式的数…

    人工智能概论 2023年5月25日
    00
  • SpringBoot使用Graylog日志收集的实现示例

    我们先来回答一下什么是Graylog和SpringBoot。 Graylog是一款开源的、高性能、分布式日志管理系统,它可以帮助我们收集、存储和分析大规模的日志信息。Graylog除了提供Web界面进行检索和分析,还支持ES查询语句、字符过滤、GeoIP和流过滤函数等特性,能够帮助我们更快地定位异常和错误。 SpringBoot是由Spring团队提供的一个…

    人工智能概览 2023年5月25日
    00
  • php 广告调用类代码(支持Flash调用)

    下面是详细讲解“php 广告调用类代码(支持Flash调用)”的完整攻略: 1. 代码介绍 这是一个基于 PHP 编写的广告调用类,支持调用图片、Flash 和 HTML 广告,适用于 PHP 网站开发。 该类封装了广告调用的功能,可以方便地在模板中调用广告,而不需要写重复的广告代码。除此之外,该类还具备缓存功能,可以减轻数据库和服务器的负担。 2. 使用步…

    人工智能概论 2023年5月25日
    00
  • CentOS7服务器环境下vsftpd安装及配置方法

    下面是CentOS7服务器环境下vsftpd安装及配置方法的详细攻略。 安装vsftpd 在CentOS7上安装vsftpd非常简单,可以通过以下命令进行安装: sudo yum install vsftpd 配置vsftpd 首先备份一下vsftpd的默认配置文件: sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/v…

    人工智能概览 2023年5月25日
    00
  • CAM350软件怎么查看gerber文件 cam350导出gerber教程

    CAM350是一款PCB电路板生产前的流程管理软件,可以用于对gerber文件的查看、编辑和生成。下面是CAM350软件查看Gerber文件以及导出Gerber教程的完整攻略: 步骤一:启动CAM350软件 在电脑桌面找到CAM350软件图标,双击运行,等待软件加载完毕。 步骤二:打开Gerber文件 点击“File”菜单栏中的“Open”选项,在打开文件对…

    人工智能概览 2023年5月25日
    00
  • Nodejs 识别图片类型的方法

    Nodejs 识别图片类型的方法 在 Node.js 中,我们可以使用第三方包 file-type 来识别图片类型,它提供了一个简单的 API 来帮助我们快速判断文件类型。 安装 可以通过 npm 安装: npm install file-type 使用 在使用 file-type 之前,需要确保你已经将图片的文件内容读取到了内存中,如果你只有图片的文件名,…

    人工智能概论 2023年5月25日
    00
  • KB5018410无法卸载怎么办?强制卸载KB5018410的三种方法

    KB5018410无法卸载怎么办?强制卸载KB5018410的三种方法 问题背景 在一些 Windows 系统上,KB5018410 补丁在安装后可能会导致某些问题,需要对其进行卸载。但是,有些用户发现在控制面板中无法卸载该补丁,因此需要寻求其他方法来卸载。 解决方案 方法一:使用命令行卸载 以管理员身份打开命令行窗口(在开始菜单中找到“命令提示符”或“Wi…

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