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(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等。
第5讲 Windows消息机制及HOOK应用

HOOK管理的关键函数 SetWindowsHookEx UnhookWindowsHookEx CallNextHookEx
第5讲 Windows消息机制及HOOK应用
内容 事件/消息驱动 HOOK机制
1. Windows事件驱动机制
DOS程序的特点 顺序驱动和过程驱动
Windows程序的特点 操作无序 事件驱动 以消息为中心
WINDOWS消息处理过程
队列消息 基本上是用户输入的结果 击键(如WM_KEYDOWN和WM_KEYUP消息) 击键产生的字(WM_CHAR) 鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN) 时钟消息(WM_TIMER) 更新消息(WM_PAINT) 退出消息(WM_QUIT)
消息处理程序C
消息处理程序B
HOOK概念
消息处理程序C 消息处理程序A
消息处理程序B
C就是HOOK程序。即钩子 程序
C → B → A: 消息处理函数链
HOOK本质 一段用于处理系统消息的程序,这段程序由用户编写,挂入该消息的处理函数链中,被 OS自动调用 。
HOOK技术典型应用 木马程序【特征:平时潜伏,消息触发】 屏幕抓词、进程监控、垃圾邮件过滤、软件界面定制、……
while(ParentWnd !=NULL) { glhTargetWnd=ParentWnd; ParentWnd=GetParent(glhTargetWnd); } GetWindowText(glhTargetWnd,szCaption,100); //取目标窗口标题
windows消息机制的工作原理

windows消息机制的工作原理Windows消息机制是一种用于不同进程间进行通信的机制,Windows操作系统以消息队列为基础,将消息作为一种最基本的通信单元进行传输。
在这个机制下,进程之间可以通过发送和接收消息来进行通信。
Windows消息机制的工作原理如下:1. 消息队列的创建:每个进程都有自己的消息队列,用于存储接收到的消息。
当进程初始化时,系统会为该进程创建一个消息队列,并为之分配一个唯一的标识符。
2. 消息的发送:当一个进程需要向其他进程发送消息时,它首先需要明确消息的发送目标。
在Windows中,每个进程都有一个唯一的标识符(句柄),可以用来标识其他进程。
发送消息的进程根据目标进程的标识符,将消息发送到目标进程的消息队列。
3. 消息的接收:当一个进程接收到消息时,它需要从自己的消息队列中读取消息。
Windows提供了一种机制,使得进程可以通过消息循环来接收和处理消息。
消息循环是一个无限循环,负责从消息队列中读取消息,并将消息分发给相应的处理函数。
4. 消息的处理:一旦消息被分发给相应的处理函数,进程就可以根据消息的类型和附加数据来进行相应的处理。
处理函数可以修改进程中的状态,调用相应的函数,或者发送其他消息。
5. 消息的传递:在发送和接收消息的过程中,消息并不是实时传输的。
当一个进程发送消息时,消息并不会立即发送给目标进程,而是先存储在发送进程的消息队列中。
接收进程通过消息循环来读取消息,也是间断性的进行读取。
因此,消息的传递是一种异步的过程。
6. 消息的优先级:Windows中的消息有不同的优先级,系统会根据消息的优先级来确定消息的处理顺序。
一般情况下,系统会优先处理高优先级的消息,然后才会处理低优先级的消息。
7. 消息的同步和异步:在发送消息的过程中,Windows提供了两种方式:同步方式和异步方式。
同步方式下,发送消息的进程会等待接收进程对消息的处理完成,然后才会继续执行。
异步方式下,发送消息的进程不需要等待接收进程的处理结果,可以立即继续执行。
windows消息原理

windows消息原理Windows消息原理是Windows操作系统中一种实现进程间通信的机制。
当一个应用程序需要发送消息给另一个应用程序时,它会创建一个消息,并将该消息发送给目标应用程序的消息队列。
消息由消息标识、消息参数和消息回调函数组成。
消息标识用于识别消息的类型,每个消息标识都有一个唯一的整数值。
消息参数则用于传递附加的信息,例如鼠标位置、键盘按键等。
回调函数是接收消息并对其进行处理的函数。
当一个程序需要发送消息时,它会使用函数PostMessage或SendMessage来将消息发送给目标程序。
PostMessage函数将消息放入目标应用程序的消息队列中,并立即返回。
而SendMessage函数则会等待目标应用程序处理完消息后才返回。
接收消息的应用程序会不断从自己的消息队列中取出消息,并将其传递给消息回调函数进行处理。
回调函数根据消息类型进行相应的操作,例如更新界面、处理用户输入等。
处理完消息后,应用程序会继续处理下一个消息,直到消息队列为空。
消息机制的优点是它允许不同的应用程序之间进行松耦合的通信。
发送消息的应用程序不需要知道目标应用程序的具体实现细节,只需要知道消息标识和消息参数即可。
同时,由于消息的处理是异步的,应用程序可以同时处理多个消息,提高了系统的响应速度。
然而,消息机制也存在一些缺点。
首先,由于消息的传递是通过消息队列,因此消息的接收可能会有延迟。
另外,由于消息的处理是在接收消息的线程中进行的,如果处理消息的时间过长,会导致界面无响应或其他应用程序的操作延迟。
因此,需要合理设计消息的处理逻辑,避免长时间的阻塞操作。
总的来说,Windows消息原理是一种可靠且灵活的进程间通信机制,它为应用程序之间的数据交换提供了一种简单而高效的方式。
windows消息大全

Windows消息大全什么是Windows消息?Windows消息是在Windows操作系统中用于应用程序之间进行通信的一种机制。
通过发送和接收消息,应用程序可以向其他应用程序发送命令、请求数据或通知一些事件的发生。
Windows操作系统提供了一系列的系统消息,同时也允许应用程序自定义和发送消息。
系统消息Windows操作系统中的系统消息由操作系统负责发送和处理,这些消息通常涉及到操作系统的各个方面。
下面是一些常见的系统消息:1.WM_CREATE:当窗口被创建时发送。
2.WM_DESTROY:当窗口被销毁时发送。
3.WM_PAINT:当窗口需要绘制时发送。
4.WM_CLOSE:当用户关闭窗口时发送。
5.WM_QUIT:当应用程序需要退出时发送。
6.WM_SIZE:当窗口大小改变时发送。
7.WM_MOUSEMOVE:当鼠标移动时发送。
8.WM_KEYDOWN:当按下键盘上的一个键时发送。
这只是一小部分系统消息的例子,Windows操作系统中还有很多其他的系统消息可供使用。
自定义消息除了系统消息,应用程序还可以自定义消息以实现应用程序之间的通信。
自定义消息通常基于用户定义的消息号。
下面是一些自定义消息的例子:1.WM_MY_MESSAGE1:用户自定义的消息1。
2.WM_MY_MESSAGE2:用户自定义的消息2。
3.WM_MY_MESSAGE3:用户自定义的消息3。
自定义消息的消息号必须在WM_USER之后,以避免与系统消息冲突。
消息参数除了发送消息本身外,应用程序还可以使用参数来传递额外的信息。
参数通常包含在消息的wParam和lParam字段中。
•wParam表示一个无符号的整数,用于传递一些简单的数值信息。
•lParam通常表示一个指针,指向一些复杂的数据结构。
应用程序可以根据消息的含义和需要来使用这些参数。
如何发送和接收消息在Windows操作系统中,应用程序可以使用函数来发送和接收消息。
Windows消息处理机制与事件驱动
Windows消息处理机制与事件驱动【SunXin.VC++深⼊】1.窗⼝(Windows)和句柄(HANDLE,handle):窗⼝句柄(HWND)图标句柄(HICON)、光标句柄(HCURSOR)和画刷句柄(HBRUSH)2.消息,消息队列,消息循环,消息响应.OS将操作包装成Message.typedef struct MSG {HWND hwnd; //窗⼝句柄,即标⽰消息所属的窗⼝UINT message;//标⽰消息的类别,是⿏标还是键盘等如⿏标左键按下消息是WM_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN,字符消息是WM_CHARWPARAM wParam;//消息的附加信息LPARAM lParam;//消息的附加信息DWORD time;//消息投递到消息队列中的时间POINT pt;//⿏标的当前位置} MSG;.消息队列,每⼀个Windows应⽤程序开始执⾏后,系统都会为该程序创建⼀个消息队列,这个消息队列⽤来存放该程序创建的窗⼝的消息 .进队消息(OS将产⽣的消息放在应⽤程序的消息队列中,让应⽤程序来处理)不进队消息(OS直接调⽤窗⼝的处理过程).Windows应⽤程序的消息处理机制while(GetMessage(&msg,NULL,0,0)){//接收到WM_QUIT消息时,才返回0TranslateMessage(&msg);//对消息进⾏包装处理然后再以消息的形式投放到消息队列DispatchMessage(&msg);//消息回传给操作系统,由操作系统调⽤窗⼝过程函数对消息进⾏处理}(1)操作系统接收到应⽤程序的窗⼝消息,将消息投递到该应⽤程序的消息队列中。
(2)应⽤程序在消息循环中调⽤GetMessage函数从消息队列中取出⼀条条的消息。
取出后,以对消息进⾏⼀些预处理,如放弃对某些消息的响应,或者调⽤TranslateMessage产⽣新的消息(3)应⽤程序调⽤DispatchMessage,将消息回传给操作系统。
深入分析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。同时 , 用户 能定义 自己的消息名称 , 也能利用 自定 义 消息来 发送通知和 传送数据 。
常用的十三种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假死。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1章Windows系统的消息机制对诸如PowerBuilder(后文简写为PB)、Visual Basic和Dephi等大多数可视化程序设计语言来讲,程序设计的核心是对象的事件、属性和方法,但对Windows系统本身而言,却是以消息处理为其控制机制。
Windows把系统中的对象都作为窗口来对待,每个窗口都有一个用来标识其身份的句柄。
Windows通过向窗口发送消息,在开发语言中转化为对象的事件,然后驱动对象,响应用户的动作。
在许多面向对象的可视化程序设计语言中,Windows的众多消息已经演变成了对象的属性或方法。
本章内容包括Windows系统的消息机制、消息的发送、消息的应用实例等。
1.1Windows的工作机制1.1.1Windows的工作方式——窗口、事件和消息全面地讨论Windows的内部工作机制需要很大的篇幅,对于一般的PB用户当然没有必要深入了解所有的技术细节。
Windows系统的工作机制,简单地说就是3个关键的概念:窗口、事件和消息。
不妨简单地将窗口看做带有边界的矩形区域。
读者也许已经了解多种不同类型的窗口,如Windows系统的“资源管理器”窗口、文字处理程序中的文档窗口或者弹出提示有约会信息的消息对话框窗口等。
除了这些最普通的窗口外,实际上还有许多其他类型的窗口。
命令按钮是一个窗口,图标、文本框、选项按钮和菜单条也都是窗口。
Windows操作系统通过给每一个窗口指定一个惟一的标识号(窗口句柄,常用hWnd表示)来管理所有的窗口。
操作系统连续地监视每一个窗口的活动或事件的信号。
事件可以通过诸如单击鼠标或按下按键的操作而产生,也可以通过程序的控制而产生,甚至可以由另一个窗口的操作而产生。
每发生一次事件,将引发一条消息发送至操作系统。
操作系统处理该消息并广播给其他窗口。
然后,每一个窗口才能根据自身处理该条消息的指令而采取适当的操作(例如,当窗口解除了其他窗口的覆盖时,重新绘制自身窗口)。
可以想象,处理各种窗口、事件和消息的所有可能的组合将有惊人的工作量。
幸运的是,PB使用户摆脱了所有的低层消息处理。
许多消息由PB自动处理了,其他的作为事件过程由编程者自行处理,这样可以快速创建强大的应用程序,而毋需涉及不必要的细节。
1.1.2句柄的概念在解释消息之前,首先了解系统如何准确地将消息发送到指定的窗口。
当一个应用或多个应用运行后,会同时创建许多个窗口,Windows作为系统的“大总管”,那么它又是如何第1章Windows系统的消息机制·3·识别每一个窗口呢?在程序设计时,通过窗口的名称属性,为每个窗口命名,然后在程序其他部分把窗口名作为识别窗口的标识。
这种通过为窗口命名来识别不同窗口的方法,对Windows 系统来讲显然是不现实的。
Windows系统是通过称之为句柄的标识符来识别每一个窗口。
句柄是系统动态分配给窗口的32位整型数标识值,常用hWnd表示,即英文handle to a window的缩写。
大量API函数都需要窗口句柄作参数,或返回一个窗口或设备场境的句柄。
句柄可以通俗地理解为Windows为系统中所有存在的窗口动态分配的身份识别号码。
在PB中,可以通过handle函数来取得窗口和控件的句柄,当声明API函数时,常把保存句柄的变量声明为Long或Ulong长整型数据类型。
Windows为窗口和控件分配句柄标识是动态,同样的程序每次运行时和在不同计算机上运行时所分配的窗口句柄标识可能是完全不一样的。
窗口的句柄属性仅能在运行时访问,该属性对窗口的外观并没有任何影响,它仅作为API 函数调用的参数或返回值,或其他需识别窗口或对象的地方。
在后面章节中,读者将会看到几乎所有涉及窗口的API函数都需要传递hWnd参数,以便函数准确获得用户要处理的窗口或对象。
句柄作为由操作系统定义的惟一的长整型值,可以用它来引用窗体和控件等对象。
在Windows系统中,API函数的调用常用的句柄包括窗口句柄,菜单句柄、设备对象句柄、设备场景句柄,等等。
如果函数需要用句柄作为参数,则应该把参数声明为传值,对于返回句柄的API函数,应将返回的句柄值声明为Long或Ulong类型数据类型。
句柄是一种标识符(ID)编号,而不是指针或者数值,不要试图对它们进行任何数学运算。
1.1.3消息的概念Windows系统是以消息处理为其控制机制,系统通过消息为窗口过程(windows procedure)传递输入。
系统和应用两者都可以产生消息。
对于每个输入事件,例如用户按下了键盘上的某个键、移动了鼠标、单击了一个控件上的滚动条,等等,系统都将产生一系列消息。
此外,对于应用带给系统的变化,如字体资源的改变、应用本身窗口的改变,系统都将通过消息以响应这种变化。
应用通过产生消息指示应用的窗口完成特定的任务,或与其他应用的窗口进行通信。
每个窗口都有一个处理Windows系统发送消息的处理程序,称为窗口程序。
它是隐含在窗口背后的一段程序脚本,其中包含对事件进行处理的代码。
Windows系统为每条消息指定了一个消息编号,例如当一个窗口变为活动窗口时,它事实上是收到一条来自Windows系统的WM_ACTIVATE消息,该消息的编号为6,它对应于PB窗口的Activate事件。
对于窗口来说,诸如Open、Activate、MouseDown、Resize等事件,实际上对应的是窗口内部的消息处理程序,这些程序对于用户来讲是不可见的。
类似地,命令按钮也有消息处理程序,它的处理程序响应诸如WM_LBUTTONDOWN和WM_RBUTTONDOWN之类的消息,即激活命令按钮的MouseDown事件。
系统向窗口发送的消息通常包含3个参数,分别是:(1)窗口句柄(a window handle):窗口句柄用来标识消息将要发送到的窗口对象,系统使用窗口句柄来确定哪一个窗口句柄应该接收该消息。
(2)消息标识符(a message identifier):消息标识符是用来区分不同消息的命名常量,PowerBuilder Win32API程序设计(高级卷)·4·当窗口过程接收到一个消息时,它使用消息标识符来确定如何处理该消息。
例如,消息标识符WM_PAINT告诉窗口过程“窗口的客户区已经发生变化,窗口必须进行重新绘制”。
(3)消息参数(message parameters):消息参数用来表述窗口过程处理消息时所使用的数据或数据的位置,通常用一对参数表示。
消息参数的意义和取值取决于消息。
消息参数取值可以是整型数、Bit位标识、指向结构的指针,等等,当不需要使用消息参数时,通常将其设置为NULL。
窗口过程必须通过检查消息标识符来确定如何对消息参数进行解释。
有关消息标识符、消息参数的具体使用,将在后面介绍Sendmessage函数时给予进一步解释。
1.1.4消息的类型1.系统定义的消息当系统与应用进行通信时,系统将发送或邮寄消息。
系统通过这些消息控制应用的运行,并为应用的进程提供输入或其他信息。
应用内部也可发送或邮寄系统定义的消息,应用通常使用这些消息控制由预先注册的窗口类创建的窗口的操作。
每一个系统定义的消息都有一个惟一的消息标识符(值),并用一个表明消息用途标识符常量表示(这些在SDK的头文件中定义)。
如WM_PAINT消息标识符表示要求窗口进行重绘的消息。
消息标识符常量前缀表示消息所属的消息类别,如WM_表示窗口类消息,BM_表示按钮类消息,表1-1给出了不同类别消息的前缀。
在PB中,消息标识符常量通常声明为窗口或对象的实例常量,例如:CONSTANT long WM_MOUSEMOVE=512CONSTANT long WM_LBUTTONDOWN=513CONSTANT long WM_LBUTTONUP=514CONSTANT long WM_LBUTTONDBLCLK=515CONSTANT long WM_RBUTTONDOWN=516CONSTANT long WM_RBUTTONUP=517CONSTANT long WM_RBUTTONDBLCLK=518表1-1Windows系统定义的消息类别消息标识符前缀消息分类ABM应用桌面工具栏消息BM按钮控件消息CB组合框控件消息CBEM扩展组合框控件消息CDM通用对话框消息DBT设备消息DL拖曳列表框控件消息DM默认按钮控件消息DTM日期时间选取控件消息续表第1章Windows系统的消息机制·5·消息标识符前缀消息分类EM编辑控件消息HDM头控件消息HKM热键控件消息IPM IP地址控件消息LB列表框控件消息LVM列表视图控件消息MCM月历控件消息PBM进度条控件消息PGM Pager控件消息PSM属性页面消息RB Rebar控件消息SB状态栏窗口消息SBM滚动条控件消息STM静态控件消息TB工具栏消息TBM跟踪条控件消息TCM Tab控件消息TTM Tooltip控件消息TVM树形控件消息UDM Up-down控件消息WM普通窗口消息Windows系统使用了成千上万条消息。
从窗口到控件都有一组可接收和响应的消息。
在Visual Basic的API浏览器中,以常量的方式列出了Windows的大部分消息。
据粗略统计,微软在MSDN中列出的消息约有数千种,全部弄清楚这么多种消息是不现实的,也是没有必要的。
这是因为PB已经将很多消息封装为了对象的“属性”(例如窗口的Title和WindowState属性)和“方法(函数)”(例如关闭窗口函数Close)。
可以发现,消息可能演变成PB对象的属性、方法(函数)和事件。
既然PB已经对消息进行了封装,那么又何必使用消息来进行程序设计呢?这时因为,PB提供的事件、属性和方法并未完全涵盖所有消息,为了弥补PB在某些功能的不足,常使用系统消息或应用自定义的消息来强化PB的程序设计。
2.应用定义的消息应用也可以创建自己的消息,并将消息应用于它的窗口或与其他窗口的进程进行通信。
如果应用创建了自己的消息,接收消息的窗口过程必须解释消息,同时对消息进行恰当的处理。
系统保留的消息标识符的取值范围为0x0000~0x03FF(0~1023),专门用于系统定义的消息;应用定义的消息不能使用这些值,应用定义的消息取值范围为0x0400~0x7FFF(0~32767)。
RegisterWindowMessage函数提供了分配消息编号的功能,该函数用一个消息名称作为参数,并为这个名称分配一个惟一的、尚未使用过的编号。
PowerBuilder Win32API程序设计(高级卷)·6·1.1.5用于发送消息的API函数Windows应用程序允许应用程序向自己或其他应用程序发送消息,甚至可以向Windows 操作系统本身发送消息(比如要求关闭操作系统或重新启动操作系统)。