Windows消息机制

本文介绍了Windows平台下程序运行的关键要素,包括SDK和API的概念,窗口与句柄的管理,消息与消息队列的工作原理,以及WinMain函数在程序启动中的作用。详细阐述了消息机制,重点是GetMessage和DispatchMessage函数的使用。
摘要由CSDN通过智能技术生成

1、首先需要理解 Windows 平台下程序运行的内部机制。

1) SDK和API

SDK: 软件开发工具包(Software Development Kit),一般都是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。

API函数: Windows操作系统提供给应用程序编程的接口(Application Programming Interface)。

Windows应用程序API函数是通过C语言实现的,所有主要的 Windows 函数都在 Windows.h 头文件中进行了声明。Windows 操作系统提供了 1000 多种 API函数。

2) 窗口和句柄

2.1 窗口是 Windows 应用程序中一个非常重要的元素,一个 Windows 应用程序至少要有一个窗口,称为主窗口。

窗口是屏幕上的一块矩形区域,是 Windows 应用程序与用户进行交互的接口。利用窗口可以接收用户的输入、以及显示输出。

一个应用程序窗口通常都包含(标题栏、菜单栏、系统菜单、最小化框、最大化框、 可调边框,有的还有滚动条)。如下图:

窗口可以分为客户区非客户区, 如上图。

窗口的客户区:是的一部分, 应用程序通常在客户区中显示文字或者绘制图形。

窗口的非客户区:标题栏、 菜单栏、 系统菜单、 最小化框和最大化框、 可调边框, 它们由 Windows 系统来管理, 而应用程序则主要管理客户区的外观及操作。

窗口可以有一个父窗口, 有父窗口的窗口称为子窗口。除了上图所示类型的窗口外, 对话框和消息框也是一种窗口。 在对话框上通常还包含许多子窗口, 这些子窗口的形式:有按钮、 单选按钮、 复选框、 组框、 文本编辑框等。

2.2 在 Windows 应用程序中, 窗口是通过窗口句柄( HWND) 来标识的。 我们要对某个窗口进行操作, 首先就要得到这个窗口的句柄。

句柄( HANDLE) 是 Windows 程序中一个重要的概念, 使用也非常频繁。 在 Windows 程序中, 有各种各样的资源( 窗口、 图标、光标,画刷等), 系统在创建这些资源时会为它们分配内存, 并返回标识这些资源的标识号, 即句柄。 在后面的内容中我们还会看到图标句柄( HICON)、 光标句柄( HCURSOR) 和画刷句柄( HBRUSH)。

3) 消息与消息队列

Windows 程序设计是一种完全不同于传统的 DOS 方式的程序设计方法。它是一种事件驱动方式的程序设计模式,主要是基于消息的。每一个 Windows 应用程序开始执行后, 系统都会为该程序创建一个消息队列, 这个消息队列用来存放该程序创建的窗口的消息。例如,当用户在窗口中画图的时候,按下鼠标左键,此时,操作系统会感知到这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,等待应用程序的处理。然后应用程序通过一个消息循环不断地从消息队列中取出消息,并进行响应。 在这个处理过程中,操作系统也会给应用程序“ 发送消息”。所谓“ 发送消息”,实际上是操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口过程。

4) WinMain函数

当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数( 实际是由插入到可执行文件中的启动代码调用的)。 WinMain是Windows程序的入口点函数,与DOS程序的入口点函数main的作用相同,当WinMain 函数结束或返回时,Windows应用程序结束。

二、消息机制

 应用程序的消息机制主要由消息循环来处理:

while (GetMessage(&msg, NULL, 0, 0))
{
     TranslateMessage(&msg);//翻译消息(键盘的虚拟键消息->字符消息)
     DispatchMessage(&msg);//派发消息
}

1.GetMessage 函数从应用程序的队列里取出一个消息,

如果这个消息是 WM_QUIT(程序退出消息)就返回 0,结束 while 循环;

如果不是退出消息,那么就执行 TranslateMessage 翻译消息。

2.调用 DispatchMessage 将消息分派给相应的窗口过程。

参考文章:Windows消息机制_51CTO博客_windows消息机制详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值