`

理解Windows消息机制

 
阅读更多

理解Windows消息机制

Windows系统是一个消息驱动的OS,什么是消息呢?我很难说得清楚,也很难下一个定义(谁在嘘我),我下面从不同的几个方面讲解一下,希望大家看了后有一点了解。

1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。

2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。

3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。

4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。

5、示例:下面有一段伪代码演示如何在窗口过程中处理消息

LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM)
{
 switch(uMessageType)
 {//使用SWITCH语句将各种消息分开
  case(WM_PAINT):
   doYourWindow(...);//在窗口需要重新绘制时进行输出
  break;
  case(WM_LBUTTONDOWN):
   doYourWork(...);//在鼠标左键被按下时进行处理
  break;
  default:
   callDefaultWndProc(...);//对于其它情况就让系统自己处理
  break;
 }
}

 

接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。下面的伪代码演示了消息循环的用法:

while(1)
{
 id=getMessage(...);
 if(id == quit)
  break;
 translateMessage(...);
}

当该程序没有消息通知时getMessage就不会返回,也就不会占用系统的CPU时间。图示消息投递模式 

在16位的系统中系统中只有一个消息队列,所以系统必须等待当前任务处理消息后才可以发送下一消息到相应程序,如果一个程序陷如死循环或是耗时操作时系统就会得不到控制权。这种多任务系统也就称为协同式的多任务系统。Windows3.X就是这种系统。

而32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。Windows95/NT就是这种系统。

分享到:
评论

相关推荐

    Windows消息机制

    理解Windows消息机制对于开发高质量的Windows应用程序至关重要。 #### 二、Windows多线程与消息需求 1. **多线程环境**:Windows是一个抢占式多线程操作系统,这意味着多个线程可以在同一时刻并发执行。为了有效地...

    理解Windows消息机制.doc

    windows

    windows消息机制

    理解Windows消息机制对于编写高效、响应式的GUI(图形用户界面)程序至关重要。 首先,我们来详细了解一下Windows消息的流程: 1. **事件生成**:当用户与应用程序交互,如按下键盘或点击鼠标时,操作系统会生成一...

    windows消息机制及其应用.doc

    在古典Windows编程中,开发者直接使用Windows API编写程序,这种方式能够更深入地理解Windows消息机制。程序员需要定义窗口类,创建窗口,并编写窗口过程函数,这个函数会接收和处理来自操作系统的消息。窗口过程是...

    Windows消息机制要点

    Windows消息机制是Windows图形...理解Windows消息机制对于编写Windows应用程序至关重要,因为它是用户界面响应性和正确性的基础。通过熟练掌握消息的发送、接收和处理,开发者能够构建高效、响应性强的GUI应用程序。

    Windows消息机制.pdf

    Windows消息机制是Windows操作系统的核心组成部分之一,它允许应用程序之间以及应用程序内部进行通信和数据交换。Windows消息是一个通知,表示有一个特定的事件发生了,例如鼠标点击、按键按下、窗口尺寸改变等。...

    Windows 消息机制

    通过查看和运行这个示例,你可以更直观地理解Windows消息机制的运作。 总之,Windows消息机制是构建用户界面的基础,理解并熟练掌握消息的产生、传递和处理对于Windows应用程序开发至关重要。通过深入学习和实践,...

    Windows消息响应机制.

    理解Windows消息机制对于深入掌握Windows编程至关重要。 ##### 1. 消息的基本概念 消息是Windows系统中一种重要的通信方式,它是由消息名(UINT类型)和两个参数(WPARAM与LPARAM)组成的结构体。当用户与系统交互...

    windows消息查询器源码

    在Windows操作系统中,消息查询器(Message Queryer)是一个实用工具,它可以帮助开发者或系统管理员深入理解Windows消息机制。源码分析将揭示其中的核心概念和技术细节。本篇将围绕"Windows消息查询器源码"这一主题...

    PB window消息机制

    首先,我们要理解Windows消息机制的基本概念。在Windows系统中,所有的用户交互,无论是键盘输入、鼠标点击还是窗口状态变化,都会被转化为特定的消息(如WM_KEYDOWN、WM_MOUSEMOVE等)。这些消息会被放入一个称为...

    Windows通信机制和DLL机制实验报告

    3. **深入理解Windows消息机制**,通过使用C++和Win32函数而非MFC框架,亲身体验Windows消息循环机制。 4. **掌握DLL机制**,了解Windows DLL机制在进程地址空间中的运作方式,以及它如何影响内存管理和资源分配。 ...

    windows消息循环机制

    Windows 消息循环机制与 API 程序设计 Windows 消息循环机制是 Windows 操作...Windows 消息循环机制和 API 程序设计是 Windows 操作系统的核心机制之一,理解和掌握这些机制和技术是开发 Windows 应用程序的基础。

    Windows消息大全及消息列表.rar

    理解Windows消息机制对于编写高效且响应迅速的应用程序至关重要。熟练掌握消息处理可以实现复杂的用户交互,如自定义控件行为、热键设置、多线程同步等。同时,了解消息大全还有助于排查和解决程序中的问题,因为很...

    如何理解VC编程的windows消息处理机制

    Windows消息处理机制是Windows编程的核心,对于理解和编写高效、响应迅速的应用程序至关重要。本篇文章将深入探讨Windows消息处理机制,以及如何在VC编程中运用这一机制。 一、Windows消息 1. 消息队列:Windows...

Global site tag (gtag.js) - Google Analytics