windows 消息机制

合集下载

Windows消息机制详解

Windows消息机制详解

Windows消息机制详解Windows操作系统最大的特点就是其图形化的操作界面,其图形化界面是建立在其消息处理机制这个基础之上的。

如果不理解Windows消息处理机制,肯定无法深入的理解Windows编程。

可惜很多程序员对W indows消息只是略有所闻,对其使用知之甚少,更不了解其内部实现原理,本文试着一步一步向大家披露我理解的Windows消息机制。

可以说,掌握了这一部分知识,就是掌握了Windows编程中的神兵利器,灵活运用它,将会极大的提高我们的编程能力。

一、消息概述Windows窗体是怎样展现在屏幕上的呢?众所周知,是通过API绘制实现的。

Windows操作系统提供了一系列的API函数来实现界面的绘制功能,例如:DrawText绘制文字DrawEdge绘制边框DrawIcon绘制图标BitBlt 绘制位图Rectangle绘制矩形…再复杂的程序界面都是通过这个函数来实现的。

那什么时候调用这些函数呢?显然我们需要一个控制中心,用来进行“发号施令”,我们还需要一个命令传达机制,将命令即时的传达到目的地。

这个控制中心,就是一个动力源,就像一颗心脏,源源不断地将血液送往各处。

这个命令传达机制就是Windows消息机制,Windows消息就好比是身体中的血液,它是命令传达的使者。

Windows消息控制中心一般是三层结构,其顶端就是Windows内核。

Windows内核维护着一个消息队列,第二级控制中心从这个消息队列中获取属于自己管辖的消息,后做出处理,有些消息直接处理掉,有些还要发送给下一级窗体(Window)或控件(Control)。

第二级控制中心一般是各Windows应用程序的Applicat ion对象。

第三级控制中心就是Windows窗体对象,每一个窗体都有一个默认的窗体过程,这个过程负责处理各种接收到的消息。

消息是以固定的结构传送给应用程序的,结构如下:Public Type MSGhwnd As Longmessage As LongwParam As LonglParam As Longtime As Longpt As POINTAPIEnd Type其中hwnd是窗体的句柄,message是一个消息常量,用来表示消息的类型,wParam和lParam都是32位的附加信息,具体表示什么内容,要视消息的类型而定,time是消息发送的时间,pt是消息发送时鼠标所在的位置。

mfc 消息机制

mfc 消息机制

mfc消息机制
MFC(Microsoft Foundation Class)是微软开发的一种面向对象的C++框架,用于Windows操作系统的应用程序开发。

MFC消息机制是MFC框架的核心之一,其基本原理是在窗口、控件等对象之间传递消息,以便处理事件和交互。

具体而言,MFC消息机制包括以下几个方面:1.消息循环:MFC使用一个消息循环来接受和处理Windows操作系统发送的Windows消息,处理完消息后将处理结果反馈给Windows操作系统。

2.消息映射:MFC中的控件和窗口都有一个关联的消息映射表,用于将Windows消息映射到应用程序代码中的相应处理函数上。

当某个控件或窗口收到消息后,根据消息类型在相应的消息映射表中查找对应的消息处理函数,并调用相应的处理函数处理消息。

3.消息类型:MFC处理的Windows消息类型包括键盘和鼠标消息、定时器消息、系统负载消息、窗口大小变化消息等等,具体的消息类型可以在MFC框架的文档中查找。

4.消息处理函数:MFC中的消息处理函数是C++成员函数,定义为afx_msg 修饰的函数,Windows消息处理函数命名时需要遵循一定的命名规则,例如OnPaint()函数用于处理绘图事件。

需要注意的是,MFC消息机制是针对Windows操作系统设计的,其他操作系统可能具有不同的消息机制。

此外,MFC框架已经不是微软推荐的最先进的应用程序开发框架,已经逐渐被其他框架和技术所取代,例如.NET Framework,WPF,UWP等。

windows消息机制的工作原理

windows消息机制的工作原理

windows消息机制的工作原理Windows消息机制是一种用于不同进程间进行通信的机制,Windows操作系统以消息队列为基础,将消息作为一种最基本的通信单元进行传输。

在这个机制下,进程之间可以通过发送和接收消息来进行通信。

Windows消息机制的工作原理如下:1. 消息队列的创建:每个进程都有自己的消息队列,用于存储接收到的消息。

当进程初始化时,系统会为该进程创建一个消息队列,并为之分配一个唯一的标识符。

2. 消息的发送:当一个进程需要向其他进程发送消息时,它首先需要明确消息的发送目标。

在Windows中,每个进程都有一个唯一的标识符(句柄),可以用来标识其他进程。

发送消息的进程根据目标进程的标识符,将消息发送到目标进程的消息队列。

3. 消息的接收:当一个进程接收到消息时,它需要从自己的消息队列中读取消息。

Windows提供了一种机制,使得进程可以通过消息循环来接收和处理消息。

消息循环是一个无限循环,负责从消息队列中读取消息,并将消息分发给相应的处理函数。

4. 消息的处理:一旦消息被分发给相应的处理函数,进程就可以根据消息的类型和附加数据来进行相应的处理。

处理函数可以修改进程中的状态,调用相应的函数,或者发送其他消息。

5. 消息的传递:在发送和接收消息的过程中,消息并不是实时传输的。

当一个进程发送消息时,消息并不会立即发送给目标进程,而是先存储在发送进程的消息队列中。

接收进程通过消息循环来读取消息,也是间断性的进行读取。

因此,消息的传递是一种异步的过程。

6. 消息的优先级:Windows中的消息有不同的优先级,系统会根据消息的优先级来确定消息的处理顺序。

一般情况下,系统会优先处理高优先级的消息,然后才会处理低优先级的消息。

7. 消息的同步和异步:在发送消息的过程中,Windows提供了两种方式:同步方式和异步方式。

同步方式下,发送消息的进程会等待接收进程对消息的处理完成,然后才会继续执行。

异步方式下,发送消息的进程不需要等待接收进程的处理结果,可以立即继续执行。

Windows消息机制含义

Windows消息机制含义

Windows消息机制含义Windows系统是一个消息驱动的OS,什么是消息呢?接下来是小编为大家收集的Windows消息机制含义,希望能帮到大家。

Windows消息机制含义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,UINTuMessageType,WPARAM wP,LPARAM){ switch(uMessageType) {//使用SWITCH语句将各种消息分开case(WM_PAINT): doYourWindow(...);//在窗口需要重新绘制时进行输出break; case(WM_LBUTTONDOWN): doYourWork(...);//在鼠标左键被按下时进行处理break; default: callDefaultWndProc(...);//对于其它情况就让系统自己处理 break; }}接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。

windows消息原理

windows消息原理

windows消息原理Windows消息原理是Windows操作系统中一种实现进程间通信的机制。

当一个应用程序需要发送消息给另一个应用程序时,它会创建一个消息,并将该消息发送给目标应用程序的消息队列。

消息由消息标识、消息参数和消息回调函数组成。

消息标识用于识别消息的类型,每个消息标识都有一个唯一的整数值。

消息参数则用于传递附加的信息,例如鼠标位置、键盘按键等。

回调函数是接收消息并对其进行处理的函数。

当一个程序需要发送消息时,它会使用函数PostMessage或SendMessage来将消息发送给目标程序。

PostMessage函数将消息放入目标应用程序的消息队列中,并立即返回。

而SendMessage函数则会等待目标应用程序处理完消息后才返回。

接收消息的应用程序会不断从自己的消息队列中取出消息,并将其传递给消息回调函数进行处理。

回调函数根据消息类型进行相应的操作,例如更新界面、处理用户输入等。

处理完消息后,应用程序会继续处理下一个消息,直到消息队列为空。

消息机制的优点是它允许不同的应用程序之间进行松耦合的通信。

发送消息的应用程序不需要知道目标应用程序的具体实现细节,只需要知道消息标识和消息参数即可。

同时,由于消息的处理是异步的,应用程序可以同时处理多个消息,提高了系统的响应速度。

然而,消息机制也存在一些缺点。

首先,由于消息的传递是通过消息队列,因此消息的接收可能会有延迟。

另外,由于消息的处理是在接收消息的线程中进行的,如果处理消息的时间过长,会导致界面无响应或其他应用程序的操作延迟。

因此,需要合理设计消息的处理逻辑,避免长时间的阻塞操作。

总的来说,Windows消息原理是一种可靠且灵活的进程间通信机制,它为应用程序之间的数据交换提供了一种简单而高效的方式。

windows程序消息机制(Winform界面更新有关)

windows程序消息机制(Winform界面更新有关)

windows程序消息机制(Winform界⾯更新有关)1. Windows程序消息机制Windows GUI程序是基于消息机制的,有个主线程维护着消息泵。

这个消息泵让windows程序⽣⽣不息。

Windows程序有个消息队列,窗体上的所有消息是这个队列⾥⾯消息的最主要来源。

这⾥的While循环使⽤了GetMessage() 这个⽅法,这是个阻塞⽅法,也就是队列为空时⽅法就会阻塞,从⽽这个While循环停⽌运动,这避免了⼀个程序把cpu⽆缘⽆故的耗尽,让其他程序难以得到响应。

当然在某些需要cpu最⼤限度运动的程序⾥⾯就可以使⽤另外的⽅法,例如某些3d游戏或者及时战略游戏中,⼀般会使⽤PeekMessage()这个⽅法,它不会被windows阻塞,从⽽保证整个游戏的流畅和⽐较⾼的帧速。

(PeekMessage是⼀个Windows API函数。

该函数为⼀个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。

DispatchMessage功能是发送消息给窗⼝,窗⼝收到消息,执⾏事件)。

这个主线程维护着整个窗体以及上⾯的⼦控件。

当它得到⼀个消息,就会调⽤DispatchMessage()⽅法派遣消息,这会引起对窗体上的窗⼝过程的调⽤。

窗⼝过程⾥⾯当然是程序员提供的窗体数据更新代码和其它代码。

2. dotnet⾥⾯的消息循环public static void Main(string[] args){Form f = new Form();Application.Run(f);}Dotnet窗体程序封装了上述的while循环,这个循环就是通过Application.Run⽅法启动的。

3、线程外操作GUI控件的问题如果从另外⼀个线程操作windows窗体上的控件,就会和主线程产⽣竞争,造成不可预料的结果,甚⾄死锁。

因此windows GUI编程有⼀个规则,就是只能通过创建控件的线程来操作控件的数据,否则就可能产⽣不可预料的结果。

mfc 信息机制

mfc 信息机制

mfc 信息机制MFC信息机制MFC(Microsoft Foundation Class)是微软公司推出的一套用于Windows操作系统的C++类库,它为开发者提供了丰富的工具和组件,用于快速构建Windows应用程序。

在MFC中,信息机制是其重要特性之一,它提供了一种方便的方式来管理和传递应用程序中的消息。

一、消息机制的基本概念在MFC中,消息是指应用程序中发生的各种事件,比如鼠标点击、键盘输入、窗口关闭等。

消息机制是指MFC框架中的一套机制,用于处理和分发这些消息。

消息的处理过程包括两个关键组件:消息映射和消息处理函数。

1. 消息映射消息映射是指将消息和消息处理函数进行关联的过程。

通过在类的消息映射表中添加相应的消息和处理函数的映射关系,可以告诉MFC框架在收到某个消息时应该调用哪个函数进行处理。

消息映射表一般定义在类的声明中,使用宏来声明消息映射表的内容。

2. 消息处理函数消息处理函数是指用于处理特定消息的函数。

当MFC框架收到某个消息时,会根据消息映射表中的映射关系调用相应的消息处理函数。

消息处理函数可以是类的成员函数,也可以是全局函数,具体取决于消息映射表中的声明方式。

二、消息机制的应用场景消息机制在MFC中广泛应用于用户界面的交互和事件响应。

通过消息机制,开发者可以方便地处理用户的操作和系统的事件,实现各种功能和交互效果。

1. UI事件响应在MFC应用程序中,用户通过与界面上的控件进行交互来触发各种事件,比如按钮点击、菜单选择等。

通过消息机制,我们可以将这些事件与相应的处理函数进行关联,当用户触发某个事件时,可以执行相应的处理逻辑。

2. 窗口消息处理MFC中的窗口是指用户界面上的各种窗口元素,比如对话框、窗口、视图等。

窗口消息是指与窗口相关的各种事件,比如窗口创建、大小改变、关闭等。

通过消息机制,我们可以对窗口消息进行处理,实现窗口的初始化、布局、关闭等功能。

3. 自定义消息除了系统定义的消息类型,MFC还支持自定义消息。

深入分析Windows消息机制

深入分析Windows消息机制

维护 大 多 数 可视 对 象 的 句 柄( 口、 话 框 、 钮 、 辑 框 窗 对 按 编
等) 。句 柄 决 定 消 息 被 发 送 到 哪 个 窗 口 。
() 1 标准 消息 : 了 WM OMMAND, 除 C 所有 的 以 WM 开
头 的消 息都是标 准消 息 。如 窗 口、 鼠标 移动 、 口大 小改变 窗
() 2 命令 消息 : 自于 菜单 、 来 加速键 、 具栏按钮 的消 息, 工 这类 消息都 以 WM O C MMA ND形 式呈现 。 (1 3 通知 消息 : 由控件 产生 的消 息 。 按键和 鼠标 的单击 列 表框 都会产 生这 类消 息[ 这 类消 息 的 目的是 为 了向父 窗 口 4 ] , ( 常 是 对 话 框 ) 通 知 事 件 的 发 生 , 它 也 是 以 WM 通 C MMA O ND形 式呈现 的。 () 4 用户 白定义 的消息 。 2 2 消息结构 . 在 Wid ws n o 程序 中 ,消息本 身是作 为一个 记 录传递 给 应用 程序 的 , 个记 录 中包含 了消 息 的类 型 以及其 它信 息 , 这 由 MS G结 构体表示 。MS G结构体 的定义如 下 :
事件驱 动意 味着 操作系 统 的每一 部分 之 间 以及 操作 系统 与
在 MS G结构 中, 息是 由一个 消息 名称( N 1 两个 消 uI T 和 参数( AR M, P R WP A L A AM) 组成 。当用户进 行 了输入 或者窗 口的状态 发生改 变时 , 系统都会 发送消息 到某一个 窗 口。例 如, 当菜单 点中之后会 有 WM O C MMA D消息发送 。 中, N 其 WP A 的高字 节( WO D( aa ) AR M HI R wP r m)是命令 的 I 号 , D 是 菜单 I D。同时 , 用户 能定义 自己的消息名称 , 也能利用 自定 义 消息来 发送通知和 传送数据 。

消息机制与事件处理

消息机制与事件处理

消息机制与事件处理1. 前⾔1.1 什么是消息?要更好地使⽤C++进⾏Windows编程,就需要进⼀步了解其消息机制。

在Windows应⽤程序中,事件驱动是围绕着消息的产⽣和处理展开的,消息是对发⽣的事件的描述信息。

消息通知程序有关事件的发⽣。

⼀条消息包含有消息的名字、标识、消息发⽣时的⼀些参数,以及处理这条消息的函数⼊⼝指针。

每当⽤户进⾏某种操作,⽐如⿏标单击或键盘按键,就会触发相应的事件。

⽽事件是以消息的⽅式通知Windows应⽤程序的。

⼀旦应⽤程序获得某条消息,就根据消息映射表查找相应消息的响应函数的⼊⼝地址,调⽤该函数处理消息,完成⽤户预期的功能。

1.2 在哪⾥产⽣消息?在哪⾥对消息进⾏响应?在Windows操作系统中,应⽤程序主要以窗⼝的形式存在。

窗⼝是⼀个可视的⼈机交互界⾯,⽤来接收各种事件,如⽤户键盘/⿏标事件、外设的请求事件、定时器的请求事件、信号量的请求事件等。

因此,它也就成为应⽤程序控制消息的发送端和接收端。

即Windows应⽤程序是围绕窗⼝进⾏的,窗⼝不仅提供了可视化的应⽤程序的界⾯,也是Windows消息的产⽣和响应的地⽅。

1.3 Windows系统如何实现消息机制?消息的产⽣是由于相应的事件被触发;消息的发送以队列形式进⾏;消息响应遵循⼀定的顺序。

MFC类库为这种消息响应机制提供了完整的处理功能。

MFC类库中的很多类都具有处理相应消息的功能。

在⾯向过程的程序设计⽅式中,对外设,⽐如⿏标、键盘等的控制是通过轮询⽅式进⾏,即分别定时查询这些设备的输⼊请求来完成的。

⽽在Windows环境中,这些控制是通过消息机制完成的。

因此,Windows也被称为“基于事件驱动的、消息机制的”操作系统。

消息机制是Windows能进⾏多任务并发处理的基础,它保证了Windows下同时运⾏的程序能够协同作业。

在Windows中,应⽤程序都包含⼀个消息循环。

该消息循环持续反复检测消息队列,查看是否有⽤户事件消息,这些⽤户事件消息包括⿏标移动、单击、双击、键盘操作和计时器到达等。

常用的十三种hook类型

常用的十三种hook类型

本文将试图以下面的顺序讲解HOOK的大部分内容:1、 WINDOWS的消息机制2、 HOOK介绍3、 HOOK链4、 HOOK钩子的作用范围5、 HOOK类型6、回调函数7、 HOOK钩子的安装与卸载8、 HOOK实例演示+++++++++++++++++++WINDOWS的消息机制+++++++++++++++++++Windows系统是以消息处理为其控制机制,系统通过消息为窗口过程(windowsprocedure)传递输入。

系统和应用两者都可以产生消息。

对于每个输入事件,例如用户按下了键盘上的某个键、移动了鼠标、单击了一个控件上的滚动条,等等,系统都将产生一系列消息。

此外,对于应用带给系统的变化,如字体资源的改变、应用本身窗口的改变,系统都将通过消息以响应这种变化。

应用通过产生消息指示应用的窗口完成特定的任务,或与其他应用的窗口进行通信。

每个窗口都有一个处理Windows系统发送消息的处理程序,称为窗口程序。

它是隐含在窗口背后的一段程序脚本,其中包含对事件进行处理的代码。

Windows系统为每条消息指定了一个消息编号,例如当一个窗口变为活动窗口时,它事实上是收到一条来自Windows系统的WM_ACTIVATE消息,该消息的编号为6,它对应于VB窗口的Activate事件。

对于窗口来说,诸如Open、Activate、MouseDown、Resize 等事件,实际上对应的是窗口内部的消息处理程序,这些程序对于用户来讲是不可见的。

类似地,命令按钮也有消息处理程序,它的处理程序响应诸如WM_LBUTTONDOWN和WM_RBUTTONDOWN之类的消息,即激活命令按钮的MouseDown事件。

WINDOWS的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种回调函数(HOOK)的功能。

这种挂钩函数(HOOK)类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链。

消息机制和使用调用函数方式有何区别

消息机制和使用调用函数方式有何区别

消息机制和使⽤调⽤函数⽅式有何区别
最关键的应⽤区别是,消息机制可能解决不同线程间的数据转输和控制,⽽不同的线程间不能直接调⽤函数。

消息机制是排队处理⽅式,windows存在⼀个系统队列,每当⼀个应⽤程序或⼀个线程发⽣⼀个事件或需要处理事务的时候并不是直接调⽤应⽤程序中的函数,⽽是把需求打包,向windows申请调⽤。

系统根据调度机制,从队列中取得⼀个消息包,拆箱,检查内容,根据其来源,将消息包重新打包,发送给该包指定的应⽤程序队列。

应⽤程序回调函数循环监视应⽤程序队列,根据消息包参数处理不同事务,执⾏完后将控制权释放。

这样做的好处是将主动权让给操作系统,由系统调度分配执⾏时间,实现多任务执⾏。

只有窗⼝处理函数利⽤消息机制,⼀般情况都使⽤调⽤,除⾮你需要窗⼝处理指定的任务,那么可以在如何时候发送⼀个消息给⾃⼰窗⼝。

⾄于优缺点,消息机制针对操作系统的,⼀般任务都是直接调⽤,但是如果遇到占⽤CPU时间长的事务,就要将事务分割成⽚段,然后发送消息给系统,请求调⽤,这样不⾄于造成CPU假死。

(完整word版)常用的十三种hook类型

(完整word版)常用的十三种hook类型

本文将试图以下面的顺序讲解HOOK的大部分内容:1、 WINDOWS的消息机制2、 HOOK介绍3、 HOOK链4、 HOOK钩子的作用范围5、 HOOK类型6、回调函数7、 HOOK钩子的安装与卸载8、 HOOK实例演示+++++++++++++++++++WINDOWS的消息机制+++++++++++++++++++Windows系统是以消息处理为其控制机制,系统通过消息为窗口过程(windowsprocedure)传递输入。

系统和应用两者都可以产生消息。

对于每个输入事件,例如用户按下了键盘上的某个键、移动了鼠标、单击了一个控件上的滚动条,等等,系统都将产生一系列消息。

此外,对于应用带给系统的变化,如字体资源的改变、应用本身窗口的改变,系统都将通过消息以响应这种变化。

应用通过产生消息指示应用的窗口完成特定的任务,或与其他应用的窗口进行通信。

每个窗口都有一个处理Windows系统发送消息的处理程序,称为窗口程序。

它是隐含在窗口背后的一段程序脚本,其中包含对事件进行处理的代码。

Windows系统为每条消息指定了一个消息编号,例如当一个窗口变为活动窗口时,它事实上是收到一条来自Windows系统的WM_ACTIVATE消息,该消息的编号为6,它对应于VB窗口的Activate事件。

对于窗口来说,诸如Open、Activate、MouseDown、Resize等事件,实际上对应的是窗口内部的消息处理程序,这些程序对于用户来讲是不可见的。

类似地,命令按钮也有消息处理程序,它的处理程序响应诸如WM_LBUTTONDOWN和WM_RBUTTONDOWN之类的消息,即激活命令按钮的MouseDown事件.WINDOWS的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种回调函数(HOOK)的功能.这种挂钩函数(HOOK)类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链.系统产生的各种消息首先被送到各种挂接函数,挂接函数根据各自的功能对消息进行监视、修改和控制等,然后交还控制权或将消息传递给下一个挂接函数以致最终达到窗口函数。

Windows窗口消息机制简介

Windows窗口消息机制简介

从图中可以看出,Windows维护着一个全局系统消息队列,外界的一切动作变化,都首先以消息的形式传入到系统消息队列中。

Windows 又为每一个应用程序维护着一个属于单个应用程序的消息队列,Windows会对系统消息队列中的消息进行筛选,将属于某个应用程序的消息分配到对应的应用程序消息队列中。

无论是系统消息队列,还是应用程序的消息队列,全部都是在Windows的控制下,应用程序通过GetMessage系统调用从Windows 管辖的相对应的应用程序消息队列中取得消息,并进行处理。

从图中可以看出,通过GetMessage取得消息,有一个从用户态到内核态的过程。

因为能操作消息队列的,只有Windows自己。

应用程序取得消息之后,对消息进行简单的处理(TranslateMessage)后,通过DispatchMessage系统调用将消息返还给Windows,再由Windows以该消息为参数,调用应用程序的窗口过程函数。

也就是说,应用程序的窗口过程不是由应用程序自己直接调用的,而是通过Windows系统间接调用的。

应用程序的窗口过程之所以要由Windows来调用,而不是应用程序亲自调用,主要是因为下面几点原因:1.一个应用程序可能会有多个窗口,不同窗口的消息应该发给不同的窗口过程,如果这个过程由应用程序自己来管理的话,会给编程带来很大的难度。

2.其它的应用程序可能会通过SendMessage系统调用直接将消息通过Windows发给应用程序的窗口过程3.Windows并不是将所有的消息都放入到应用程序的消息队列中,一些紧急的消息,Windows会直接调用应用程序的窗口过程。

图中还有关于postMessage和sendMessage的介绍:postMessage是由其它应用程序调用,将消息放入到应用程序的消息队列中。

sendMessage是由其它应用程序调用,将消息直接发送大应用程序的窗口过程。

这两个方法同样都是通过Windows系统操作应用程序的窗口过程^_^。

windows消息机制的工作原理

windows消息机制的工作原理

windows消息机制的工作原理Windows 消息机制是一种用于进程间通信的机制,它通过消息队列将消息发送给目标进程并进行处理。

本文将介绍Windows消息机制的工作原理。

1. 消息队列在Windows操作系统中,每个窗口都有一个与之关联的消息队列。

消息队列是一个先进先出的队列,用于存储发送给窗口的消息。

当有消息发送给窗口时,消息会被添加到消息队列的末尾。

2. 消息循环每个窗口都有一个消息循环,它负责从消息队列中取出消息并进行处理。

消息循环是一个无限循环,不断地从消息队列中取出消息并分发给窗口的回调函数进行处理。

消息循环的伪代码如下所示:```while (GetMessage(&msg, hWnd, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}```在每次循环中,GetMessage函数会从消息队列中取出一个消息。

TranslateMessage函数用于将消息转换为键盘消息,以便处理键盘输入。

DispatchMessage函数负责将消息分发给窗口的回调函数。

3. 消息处理窗口的回调函数(也称为窗口过程)是用于处理消息的函数。

每个窗口都有一个唯一的回调函数,当接收到消息时,回调函数会根据消息类型进行相应的处理。

根据消息的不同,回调函数可以执行一系列操作,例如绘制窗口、响应用户输入等。

4. 消息参数每个消息包含一些参数,用于指定消息的类型和详细信息。

常见的消息参数包括消息类型(例如WM_CREATE、WM_PAINT等)、消息源(例如来自哪个窗口或控件)、消息的附加参数(例如鼠标点击的位置)等。

回调函数根据这些参数来判断如何处理消息。

5. 消息处理顺序Windows消息机制采用先到先服务的原则,即先发送的消息先处理。

当消息循环从消息队列中取出消息时,会按照消息的先后顺序进行处理,确保消息的有序性。

这意味着发送给窗口的消息将按照发送的顺序被处理。

Windows窗口消息机制

Windows窗口消息机制

Windows窗⼝消息机制概念:windows中程序的窗⼝和系统调⽤的实现模式都是通过⼀种消息机制来完成的。

窗⼝调⽤系统接⼝,系统发送消息给窗⼝,窗⼝轮询消息并处理。

SendMessage阻塞的,需要等待消息处理函数结束才返回。

PostMessage⾮阻塞的,只是将消息放⼊消息队列即返回。

Windows窗⼝程序的实现:1. 注册窗⼝类2. 创建及显⽰窗⼝3. 创建消息循环4. 消息处理函数1. 注册窗⼝类作⽤:设置窗⼝的属性及特征实现:调⽤RegisterClass(&wndClass),其中wndClass为结构体对象,其中的参数设置了窗⼝的属性等。

typedef struct tagWNDCLASSW {UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCWSTR lpszMenuName;LPCWSTR lpszClassName;} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;其中:style:指定窗⼝的样式 CS_HREDRAW CS_VREDRAW CS_NOCLOSE CS_DBLCLKSlpfnWndProc:窗⼝过程函数 将函数名赋值给该变量,函数声明为typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);hbrBackground:当窗⼝重绘时,重绘的默认背景颜⾊2. 创建及显⽰窗⼝以VS2017默认的Windows 桌⾯应⽤程序为例BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){hInst = hInstance; // 将实例句柄存储在全局变量中HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;}UpdateWindow会发送⼀个WM_PAINT的消息来刷新窗⼝。

MFC六大核心机制

MFC六大核心机制

MFC六大核心机制MFC(Microsoft Foundation Classes)是微软公司开发的一套基于C++语言的应用程序框架。

它提供了一系列类和函数库,方便开发人员构建Windows应用程序。

MFC框架包含了许多核心机制,下面将介绍其中的六大核心机制。

一、消息映射机制:消息映射机制是MFC框架的核心之一,它用于处理Windows消息。

Windows操作系统是事件驱动的,应用程序需要响应来自用户的输入或系统的消息。

通过消息映射机制,开发人员可以向MFC框架注册处理特定消息的函数,当该消息发生时,框架将自动调用相应的函数进行处理。

开发人员只需要在类的消息映射表中添加相应的消息与处理函数的映射关系,就可以实现消息的处理。

二、文档/视图机制:文档/视图机制是MFC框架中用来管理应用程序数据和图形界面显示的一种机制。

应用程序的数据和用户界面是相互独立的,通过文档/视图机制可以将二者进行分离。

开发人员可以创建一个或多个文档类来管理数据,同时可以创建一个或多个视图类来负责显示用户界面。

MFC框架会自动处理数据和界面之间的同步,例如当数据发生变化时,会自动更新界面;当用户修改界面时,会自动更新数据。

三、消息响应机制:消息响应机制是MFC框架中用来处理用户输入和系统消息的一种机制。

开发人员可以通过消息响应机制,将特定的消息与相应的处理函数进行关联,当该消息发生时,框架会自动调用相应的处理函数。

例如,开发人员可以通过响应鼠标点击消息来实现用户点击按钮的响应,或者通过响应键盘输入消息来实现用户输入的响应。

四、对象模型机制:对象模型机制是MFC框架中用来管理对象的一种机制。

MFC框架使用了一种轻量级的对象模型,对象之间的关系通过继承和组合来实现。

开发人员可以创建自己的类并继承自MFC提供的基类,以实现各种功能。

MFC框架提供了丰富的基类库,包括窗口类、对话框类、控件类等,开发人员可以通过继承这些基类来快速构建自己的应用程序。

Windows窗口开发原理(窗口的创建消息机制)

Windows窗口开发原理(窗口的创建消息机制)

Windows窗⼝开发原理(窗⼝的创建消息机制)在windows应⽤程序中,窗⼝是其⾮常重要的⼀个元素。

并且窗⼝是通过窗⼝句柄来标识的。

句柄(HANDLE)是windows程序中⼀个重要的概念,其标识各种资源,包括图标句柄(HICON)、光标句柄(HCURSOR)和画刷句柄(HBRUSH)。

下⾯以⼀个带有⾃定义的画刷、光标和图标的windows窗⼝为例,讲解win32窗⼝的创建过程。

windows消息机制windows程序是基于事件驱动⽅式的程序设计模式,主要是基于消息的。

⽐如当⽤户在窗⼝中画图的时候,按下⿏标左键,此时os会感知到这⼀事件,于是将此事件包装成⼀个消息,投递到应⽤程序的消息队列中,然后应⽤程序从消息队列中取出消息,经过transltor翻译、分发消息,然后交由os调⽤窗⼝过程函数(应⽤程序注册的回调函数)或(DefWindowProc系统默认的回调处理函数)进⾏处理。

创建⼀个窗⼝的基本流程设计窗⼝类窗⼝的特征是由WNDCLASS结构体来定义的,其定义了这个窗⼝的基本属性,所以我们只需填充结构体各成员信息即可。

typedef struct tagWNDCLASSW {UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCWSTR lpszMenuName;LPCWSTR lpszClassName;} WNDCLASSWtypedef WNDCLASSW WNDCLASS;//WNDCLASS是WNDCLASSW的别名View Code这⾥要⾸先说明下各类型定义//LRESULT :long// UINT:unsigned int//WPARAM:unsigned int//LPARAM:unsigned int//LPCWSTR:const w_chart_t *;// typedef WORD ATOM; //BUGBUG - might want to remove this from minwin// typedef unsigned short WORD;// typedef unsigned long DWORD;//LPCWSTR const w_char_t * 宽字符//LPCSTR const char *wchar_t szAppclassName[] = _T("FirstWin32");WNDCLASS wc;wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;//窗⼝类的样式(要让窗⼝在⽔平和垂直尺⼨发⽣变化时发⽣重绘,我们可以使⽤⽤位或|操作符将其组合起来) //WNDPROC 函数指针类型wc.lpfnWndProc = WindowProc;//窗⼝回调函数/窗⼝处理函数wc.cbClsExtra = 0;//窗⼝类的附加内存⼤⼩wc.cbWndExtra = 0;//窗⼝附加内存⼤⼩wc.hInstance = hInstance;//当前应⽤程序实例句柄wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));//加载⾃定义的图标句柄//wc.hCursor = LoadCursor(NULL,IDC_CROSS);//光标句柄;加载系统光标,也可以采⽤下⾯的⽅式加载⾃定义的光标wc.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));wc.hbrBackground = CreateSolidBrush(RGB(255, 255, 0));//红绿蓝三原⾊0~255,[0最暗,255最亮]wc.lpszMenuName = NULL;//菜单名wc.lpszClassName = szAppclassName;//窗⼝类型名 spy++(vs->⼯具选项)其中的第⼆个成员变量lpfnWndProc是⼀个函数指针,指向窗⼝过程函数,窗⼝过程函数时⼀个回调函数。

Windows消息机制详解

Windows消息机制详解

Windows消息机制详解消息是指什么?消息系统对于⼀个win32程序来说⼗分重要,它是⼀个程序运⾏的动⼒源泉。

⼀个消息,是系统定义的⼀个32位的值,他唯⼀的定义了⼀个事件,向 Windows发出⼀个通知,告诉应⽤程序某个事情发⽣了。

例如,单击⿏标、改变窗⼝尺⼨、按下键盘上的⼀个键都会使Windows发送⼀个消息给应⽤程序。

消息本⾝是作为⼀个记录传递给应⽤程序的,这个记录中包含了消息的类型以及其他信息。

例如,对于单击⿏标所产⽣的消息来说,这个记录中包含了单击⿏标时的坐标。

这个记录类型叫做MSG,MSG含有来⾃windows应⽤程序消息队列的消息信息,它在Windows中声明如下:消息可以由系统或者应⽤程序产⽣。

系统在发⽣输⼊事件时产⽣消息。

举个例⼦, 当⽤户敲键, 移动⿏标或者单击控件。

系统也产⽣消息以响应由应⽤程序带来的变化, ⽐如应⽤程序改变系统字体改变窗体⼤⼩。

应⽤程序可以产⽣消息使窗体执⾏任务,或者与其他应⽤程序中的窗⼝通讯。

消息中有什么?我们给出了上⾯的注释,是不是会对消息结构有了⼀个⽐较清楚的认识?如果还没有,那么我们再试着给出下⾯的解释:hwnd 32位的窗⼝句柄。

窗⼝可以是任何类型的屏幕对象,因为Win32能够维护⼤多数可视对象的句柄(窗⼝、对话框、按钮、编辑框等)。

message⽤于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是⾃定义的常量。

消息标识符以常量命名的⽅式指出消息的含义。

当窗⼝过程接收到消息之后,他就会使⽤消息标识符来决定如何处理消息。

例如、WM_PAINT告诉窗⼝过程窗体客户区被改变了需要重绘。

符号常量指定系统消息属于的类别,其前缀指明了处理解释消息的窗体的类型。

wParam 通常是⼀个与消息有关的常量值,也可能是窗⼝或控件的句柄。

lParam 通常是⼀个指向内存中数据的指针。

由于WParam、lParam和Pointer都是32位的,因此,它们之间可以相互转换。

windows消息机制工作原理

windows消息机制工作原理

windows消息机制工作原理
Windows消息机制是Windows操作系统中的核心特性之一,它允许不同的应用程序之间进行通信和交互。

当一个应用程序需要与另一个应用程序进行交互时,它可以发送一个消息到目标应用程序。

目标应用程序会接收这个消息并做出相应的处理。

Windows消息机制的工作原理可以分为以下几个步骤:
1. 发送消息:当一个应用程序需要发送消息到另一个应用程序时,它会调用Windows API中的SendMessage函数或者PostMessage函数。

这些函数会将消息传递给操作系统内核,并将消息发送到目标应用程序的消息队列中。

2. 消息队列:每个应用程序都有一个消息队列,它用于存储来自其他应用程序的消息。

Windows操作系统会在后台自动地维护这些消息队列,并当应用程序准备好时通知它们有新的消息到达。

3. 消息循环:每个应用程序都有一个消息循环,它用于获取来自消息队列的消息并将其传递给相应的消息处理程序。

当操作系统通知应用程序有新的消息到达时,应用程序会从消息队列中获取消息并将其传递给消息循环。

4. 处理消息:每个应用程序都有一个消息处理程序,它用于处理来自其他应用程序的消息。

当消息循环从消息队列中获取到消息时,它会将消息传递给相应的
消息处理程序进行处理。

总之,Windows消息机制利用了操作系统层面的消息队列和消息循环来实现应用程序之间的通信和交互。

这种机制可以帮助开发者实现非常灵活的应用程序,并且非常适合多任务处理和多线程应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows操作系统提供了1000多种API函数,作为开发人员,要全部记住这些函数调用的语法几乎是不可能的。那么我们如何才能更好的去使用和掌握这些函数呢?微软提供了API函数大多是有意义的单词的组合,每个单词的首字母大写,例如CreateWindow,读者从函数的名字上就可以猜到,这个函数是用来为程序创建一个窗口的。其他的,例如,ShowWindow(用于显示窗口),LoadIcon(用于加载图标),SendMessage(用于发送消息)等,这些函数的准确拼写与调用语法都可以在MSDN中查找到。
三、消息与消息队列
在传统的C程序中,我们调用fopen函数打开文件,这个库函数最终调用操作系统(提供的函数)来打开文件。而在Windows中,不仅用户程序可以调用系统的API函数,返回来,系统也会调用用户程序,这个调用是通过消息来进行的。
Windows程序设计是一种完全不同于传统的DOS方式的程序设计方法。它是一种事件驱动方式的程序设计模式,主要是基于消息的。例如,当用户在窗口中画图的时候,按下鼠标左键,此时,操作系统会感知这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,然后应用程序从消息队列中取出消息并进行响应。在这个处理过程中,操作系统也会给应用程序“发送消息”。所谓“发送消息”,实际上是操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口过程。
3.进队消息和不进队消息
Windows程序中的消息可以分为“进队消息”和“不进队消息”。进队的消息将由系统放入到应用程序的消息队列中。然后由应用程序取出并发送。不进队的消息在系统调用窗口过程时直接发送给窗口。不管是进队消息还是不进队消息,最终都由系统调用窗口过程函数对消息进行处理。
第一步:定义消息。一个消息实际上是开发 Windows95 应用程序时, Microsoft 推荐用户自定义消息至少是 WM_USER+100 ,因为很多新控件也要使用 WM_USER 消息。
第二步:实现消息处理函数。该函数使用 WPRAM 和 LPARAM 参数并返回 LPESULT 。
我们经常听人说Win32 SDK开发,那么什么是SDK呢。SDK的全程是Software Development Kit,中文译为软件开发包。加入现在我们要开发呼叫中心,在购买语音卡的同时,厂商就会提供语音卡的SDK开发包,以方便我们对语音卡的编程操作。这个开发包通常都会包含语音卡的API函数库、帮助文档、使用手册、辅助工具等资源。也就是说,SDK实际上就是开发所需资源的一个集合。现在读者应该明白Win32 SDK的含义了吧,即Windows 32位平台下的软件开发包,包括了API函数、帮助文档、微软提供的一些辅助开发工具。
一、API与SDK
我们在编写标准C程序的时候,经常会调用各种库函数来辅助完成某些功能;初学者使用的最多的C库函数就是printf了,这些库函数是由你所使用的编译器厂商提供的。在Windows平台下,也有类似的函数可供调用;不同的是,这些函数是由Windows操作系统本身提供的。
Windows操作系统提供了各种各样的函数,以方便我们开发Windows应用程序。这些函数是Winsows操作系统提供给应用程序编程的接口(Application Programming Interface),简称为API函数。我们在编写Windows程序时所说的API函数,就是指系统提供的函数,所有主要的Windows函数都在Windows.h头文件中进行了声明。
VC++深入详解----Windows程序内部运行机制(1)
对于编程初学者的忠告里huangjin2007说的特别好,现在的初学者学编程的确走入了不少误区,一些人太急于去做出些什么了。
其实这也不能完全怪学习者,现在市面上很多介绍Visual C++开发的书籍,一上来就讲解MFC,并且只讲操作不讲原理,结果使得很多初学者看完书后感觉云山雾绕。例如一本书《Visual c++教程》(清华大学出版社 郑阿奇 主编),第一章是C++基础,讲的c++基础语言,占了30页;第二章Windows编程基础,的确是基础,完全是简介,只用了20页;第三章到第六章分别写对话框、常用控件、菜单等等的创建及属性;随后章节讲数据库、图形文本等,再加上一个高级应用,所谓高级就是多媒体、动态链接库等内容。
而孙鑫的一本《VC++深入详解》(电子工业出版社),用了100页来描写内部运行机制、C++、MFC框架程序剖析等这些内容,这在讲解VC++的教材中已经详细了许多,但是要真正想巩固这些基础问题只能如huangjin2007所说的在这之前看一本独立讲解Windows编程的书。
本帖摘文,为学习者深入剖析Windows程序的内部运行机制,扫清VC++学习路途中的第一个障碍,为进一步学习MFC程序打下基础。
第四步:在用户类的消息块中,使用 ON_MESSAGE 宏指令将消息映射到消息处理函数中。
VC++中使用用户自定义消息及自定制窗口技巧
Windows 应用程序所要做的每项工作几乎都是基于消息处理的, Windows 系统消息分为常用 Windows 消息,控件通知消息和命令。然而,有时我们需要定义自己的消息来通知程序什么事情发生了,这就是用户自定义消息。 ClassWizard 并没有提供增加用户自定义消息的功能,所以要使用用户自定义消息,必须手工编写代码。然后 ClassWizard 才可以象处理其它消息一样处理你自定义的消息。具体做法如下详解:
提示:API和SDK是一种广泛使用的专业术语,并没有专指某一种特定的API和SDK,例如,语音卡API、语音卡SDK、Java API、Java SDK等。
二、窗口与句柄
窗口是Windows应用程序中一个非常重要的元素,一个Windows应用程序至少要有一个窗口,称为主窗口。窗口是屏幕上的一块矩形区域,是Windows应用程序与用户进行交互的接口。利用窗口,可以接收用户的输入,以及显示输出。
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam){// TODO: 处理用户自定义消息 AfxMessageBox(" 处理用户自定义消息 "); return 0;}
第三步:在类头文件的 AFX_MSG 块中说明消息处理函数:
第二个成员变量message指定了消息的标识符。在Windows中,消息是由一个数值来表示的,不同的消息对应不同的数值。但是由于数值不便于记忆,所以Windows将消息对应的数值定义为WM_XXX宏(WM是Window Message的缩写)的形式,XXX对应某种消息的英文拼写的大写形式。例如,鼠标左键按下的消息是WM_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN,字符消息是WM_CHAR,等等。在程序中我们通常都是以WM_XXX宏的形式来使用消息的。
1.消息
在Windows程序中,消息是由MSG结构体来表示的。MSG结构体的定义如下(参见MSDN):
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lparam;
DWORD time;
最后两个变量分别表示消息投递到消息队列中的时间和鼠标的当前位置。
2.消息队列
每一个Windows应用程序开始执行后,系统都会为改程序创建一个消息队列,这个消息队列用来存放改程序创建的窗口的消息。例如,当我们按下鼠标左键的时候,将会产生WM_LBUTTONDOWN消息,系统会将这个消息放到窗口所属的应用程序的消息队列中,等待应用程序的处理。Windows将产生的消息依次放到消息队列中,而应用程序则通过一个消息循环不断第从消息队列中取出消息,并进行响应。这种消息机制,就是Windows程序运行的机制。关于消息队列和消息响应,在后面我们还会详细讲述。
你可以把MSDN理解为微软向开发人员提供的一套帮助系统,其中包含大量的开发文档、技术文章和示例代码。MSDN包含的信息非常全面,程序员不但可以利用MSDN来辅助开发,还可以利用MSDN来进行学习,从而提高自己。对于初学者来说,学会使用MSDN病从中汲取知识,是必须要掌握的技能。
我们在程序开发过程中,没有必要去死记硬背函数的调用语法和参数信息,只要能快速第从MSDN中找到所需的信息就可以了,等使用的次数多了,这些函数自然也就记住了。
POINT pt;
} MSG;
改结构体中各成员变量的含义如下:
第一个成员变量hwnd表示消息所属的窗口。我们通常开发的程序都是窗口应用程序,一个消息一般都是与某个窗口相关联的。例如,在某个活动窗口中按下鼠标左键,产生的按键消息就是发给该窗口的。在Windows程序中,用HWND类型的变量来标识窗口。
窗口可以有一个父窗口,有父窗口的窗口称为子窗口。对话框和消息框也是一种窗口。在对话框上通常还包含许多子窗口,这些子窗口的形式有按钮、单选按钮、复选框、组框、文本编辑框等。
提示:我们在启动Windows系统后,看到的桌面也是一个窗口,称为桌面窗口,它由Windows系统创建和管理。
在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。我们要对某个窗口进行操作,首先就要得到这个窗口的句柄。句柄(HANDLE)是Windows程序中一个重要的概念,使用也非常频繁。在Windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为它们分配内存,并返回标识这些资源的标识号,即句柄。在后面的内容中我们还会看到图标句柄(HICON)、光标句柄(HCURSOR)和画刷句柄(HBRUSH)。
class CMainFrame:public CMDIFrameWnd{
相关文档
最新文档