Windows消息传递机制详解
- 格式:docx
- 大小:182.58 KB
- 文档页数:23
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(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消息机制的工作原理如下:1. 消息队列的创建:每个进程都有自己的消息队列,用于存储接收到的消息。
当进程初始化时,系统会为该进程创建一个消息队列,并为之分配一个唯一的标识符。
2. 消息的发送:当一个进程需要向其他进程发送消息时,它首先需要明确消息的发送目标。
在Windows中,每个进程都有一个唯一的标识符(句柄),可以用来标识其他进程。
发送消息的进程根据目标进程的标识符,将消息发送到目标进程的消息队列。
3. 消息的接收:当一个进程接收到消息时,它需要从自己的消息队列中读取消息。
Windows提供了一种机制,使得进程可以通过消息循环来接收和处理消息。
消息循环是一个无限循环,负责从消息队列中读取消息,并将消息分发给相应的处理函数。
4. 消息的处理:一旦消息被分发给相应的处理函数,进程就可以根据消息的类型和附加数据来进行相应的处理。
处理函数可以修改进程中的状态,调用相应的函数,或者发送其他消息。
5. 消息的传递:在发送和接收消息的过程中,消息并不是实时传输的。
当一个进程发送消息时,消息并不会立即发送给目标进程,而是先存储在发送进程的消息队列中。
接收进程通过消息循环来读取消息,也是间断性的进行读取。
因此,消息的传递是一种异步的过程。
6. 消息的优先级:Windows中的消息有不同的优先级,系统会根据消息的优先级来确定消息的处理顺序。
一般情况下,系统会优先处理高优先级的消息,然后才会处理低优先级的消息。
7. 消息的同步和异步:在发送消息的过程中,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操作系统中一种实现进程间通信的机制。
当一个应用程序需要发送消息给另一个应用程序时,它会创建一个消息,并将该消息发送给目标应用程序的消息队列。
消息由消息标识、消息参数和消息回调函数组成。
消息标识用于识别消息的类型,每个消息标识都有一个唯一的整数值。
消息参数则用于传递附加的信息,例如鼠标位置、键盘按键等。
回调函数是接收消息并对其进行处理的函数。
当一个程序需要发送消息时,它会使用函数PostMessage或SendMessage来将消息发送给目标程序。
PostMessage函数将消息放入目标应用程序的消息队列中,并立即返回。
而SendMessage函数则会等待目标应用程序处理完消息后才返回。
接收消息的应用程序会不断从自己的消息队列中取出消息,并将其传递给消息回调函数进行处理。
回调函数根据消息类型进行相应的操作,例如更新界面、处理用户输入等。
处理完消息后,应用程序会继续处理下一个消息,直到消息队列为空。
消息机制的优点是它允许不同的应用程序之间进行松耦合的通信。
发送消息的应用程序不需要知道目标应用程序的具体实现细节,只需要知道消息标识和消息参数即可。
同时,由于消息的处理是异步的,应用程序可以同时处理多个消息,提高了系统的响应速度。
然而,消息机制也存在一些缺点。
首先,由于消息的传递是通过消息队列,因此消息的接收可能会有延迟。
另外,由于消息的处理是在接收消息的线程中进行的,如果处理消息的时间过长,会导致界面无响应或其他应用程序的操作延迟。
因此,需要合理设计消息的处理逻辑,避免长时间的阻塞操作。
总的来说,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程序消息机制(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编程有⼀个规则,就是只能通过创建控件的线程来操作控件的数据,否则就可能产⽣不可预料的结果。
操作系统的消息传递和进程间通信实现进程间的信息传递和通信操作系统是计算机中非常重要的一个组成部分,它负责管理和控制计算机的硬件和软件资源。
在多道程序设计环境下,操作系统需要负责调度和管理多个进程的执行。
而进程间的信息传递和通信是操作系统中一个关键的功能,它使得不同进程之间能够相互交互、传递数据,从而实现协同工作和资源共享。
本文将探讨操作系统中的消息传递和进程间通信,以及它们的实现方法和技术。
一、消息传递在操作系统中,进程间的信息传递可以通过消息传递的方式来实现。
消息传递是指一个进程向另一个进程发送消息,并由接收进程接收和处理该消息。
消息传递可以用于进程间的同步和通信,从而实现进程之间的交互。
消息传递一般包括以下几个步骤:1. 消息的创建:发送进程首先需要创建一条消息,并在消息中填写相应的内容。
消息可以包含数据、指令等信息,以满足不同的需求。
2. 消息的发送:发送进程将创建好的消息发送给接收进程。
发送进程需要指定接收进程的标识符,以确保消息能够被正确地发送到目标进程。
3. 消息的接收:接收进程通过等待操作等待消息的到达。
当消息到达时,接收进程将检查消息的标识符,以确定该消息是否是自己所期望接收的。
4. 消息的处理:接收进程接收到消息后,会对消息进行处理。
处理的方式取决于消息的内容和接收进程的需求。
消息传递可以有两种方式:直接消息传递和间接消息传递。
直接消息传递是指发送进程直接发送消息给接收进程。
间接消息传递是指通过操作系统的消息队列来传递消息。
不同的方式适用于不同的场景和需求。
二、进程间通信的实现为了实现进程间的信息传递和通信,操作系统提供了多种机制和技术。
以下是几种常见的进程间通信的实现方式:1. 共享内存共享内存是一种在多个进程之间共享同一块物理内存的方式。
通过将一块内存区域映射到多个进程的地址空间中,进程可以通过读写共享内存的方式来进行通信。
共享内存的优点是速度快,但需要进程之间进行同步和互斥操作,以避免数据的冲突和错误。
window post message 实现原理window.postMessage() 方法是 HTML5 中引入的一种用于在不同的窗口或框架之间安全地传递消息的方式。
它允许一个窗口向其他窗口发送消息,而不考虑这些窗口是否属于同一个域。
这种跨域通信的方式非常有用,可以在不同的窗口之间共享数据、进行实时通信等。
实现原理如下:1. 窗口对象之间的通信:window.postMessage() 方法是通过使用消息事件(message event)来实现窗口之间的通信。
调用 postMessage() 方法时,会触发消息事件,其他窗口可以通过监听该事件来接收消息。
2. 消息的传递和接收:postMessage() 方法接受两个参数,第一个参数是要发送的消息内容,可以是任意数据类型。
第二个参数是目标窗口的 origin,即目标窗口的 URL,用于限制消息接收的范围。
3. 安全性限制:postMessage() 方法具有安全性限制,仅当发送消息的窗口和接收消息的窗口之间存在同源策略时,消息才能被成功接收。
不同源的窗口之间进行通信需要在目标窗口中显式地设置消息监听事件。
4. 接收消息的处理:目标窗口通过监听消息事件,并在事件处理函数中获取到消息内容和消息来源的 origin。
可以根据需要对消息内容进行处理,例如更新页面内容、执行特定操作等。
注意事项:1. 安全性:由于 postMessage() 方法可以实现跨域通信,因此需要谨慎处理接收到的消息,以防止恶意代码的注入或数据的泄露。
2. 过滤源:为了增加安全性,可以通过检查消息来源的 origin 来过滤不受信任的源,只接受来自特定源的消息。
3. 消息循环:在使用 postMessage() 方法时,应注意避免出现消息循环(message loop),即消息发送和接收之间的无限循环调用。
总结:window.postMessage() 方法提供了一种安全可靠的跨窗口通信方式,它允许不同窗口之间传递消息,无论这些窗口是否属于同一个域。
windows进程间通信的几种方法(实用版4篇)目录(篇1)1.引言2.Windows进程间通信概述3.管道通信4.共享内存通信5.消息队列通信6.套接字通信7.结论正文(篇1)一、引言Windows操作系统以其强大的功能和灵活性,吸引了众多用户。
在Windows平台上,进程间通信(IPC)是实现应用程序之间数据交换和协作的关键。
本文将介绍几种常用的Windows进程间通信方法。
二、Windows进程间通信概述Windows进程间通信是指不同进程之间通过某种机制实现数据交换。
它允许应用程序在不同的线程或进程之间传递信息,从而实现协同工作。
在Windows平台上,有多种进程间通信机制可供选择,包括管道、共享内存、消息队列和套接字等。
三、管道通信1.概述:管道是一种用于不同进程之间数据交换的同步机制。
它提供了一种单向数据流,可实现父子进程之间的通信。
2.创建:使用CreateNamedPipe函数创建命名管道或使用CreatePipe函数创建匿名管道。
3.读取/写入:使用ReadFile和WriteFile函数进行数据的读取和写入。
4.关闭:使用CloseHandle函数关闭管道句柄。
四、共享内存通信1.概述:共享内存允许多个进程访问同一块内存区域,从而实现数据共享和快速数据访问。
2.创建:使用CreateFileMapping函数创建共享内存映射。
3.读取/写入:使用MapViewOfFile函数将共享内存映射到进程的地址空间,并进行数据的读取和写入。
4.同步:使用原子操作或信号量进行数据的同步和互斥访问。
五、消息队列通信1.概述:消息队列允许不同进程之间传递消息,实现异步通信。
它可以实现消息的批量发送和接收,适用于高并发的消息传递场景。
2.创建:使用CreateMailslot函数创建消息队列。
3.发送/接收:使用SendMessage函数发送消息,使用SendMessage 函数的异步版本接收消息。
wcf原理
WCF是Windows Communication Foundation的简称,它是一种用于构建分布式系统的编程框架。
WCF基于.NET Framework,提供了一种统一的、可扩展的编程模型来使用各种分布式技术。
WCF的原理基于拦截机制,通过通道(Channel)来传递和拦截消息。
在客户端对服务端服务进行调用时,首先会通过一个服务代理对象将调用方提供的对象序列化到消息中,然后该消息通过通道进行传递。
这些通道包括传输通道、消息编码通道、管理会话通道和传播事务通道等,形成了一个通道堆栈。
由于对象已经被序列化,消息可以跨进程或机器进行传递,利用传输通道传递到服务端。
在服务端,消息通过最底层的传输通道接收,然后解析消息编码,并一层层地往上传输。
在服务端的通道栈之上,有一个分发器(Dispatcher),它会首先对消息进行检查,然后选择一个客户端要调用的操作。
在这个过程中,消息会被反序列化。
此外,WCF的体系架构包括契约、服务运行时、消息和寄宿四个方面。
契约描述了服务的功能和作用,告诉SOA系统中的其它节点这个服务是“做什么”的;服务运行时定义了服务在运行时的具体行为;消息用于在客户端和服务端之间传递数据;寄宿则是指将服务部署到特定的环境中,并负责服务的生命周期管理。
总之,WCF通过拦截机制、通道和契约等概念,提供了一种灵活、可扩展的分布式系统开发方式。
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消息机制采用先到先服务的原则,即先发送的消息先处理。
当消息循环从消息队列中取出消息时,会按照消息的先后顺序进行处理,确保消息的有序性。
这意味着发送给窗口的消息将按照发送的顺序被处理。
消息传输工作原理是什么
消息传输是指将消息从一个发送者传递给一个或多个接收者的过程。
在计算机网络中,消息传输通常通过网络传输协议来实现。
消息传输的工作原理可以分为以下几个步骤:
1. 数据封装:发送者将要传输的消息封装为特定的数据包或帧。
这通常包括添加头部信息、校验和等数据,以便于接收者正确解析和处理。
2. 路由选择:发送者根据网络拓扑和路由表选择合适的路径来传输数据。
这可以通过路由选择算法来实现,例如使用最短路径优先算法。
3. 数据传输:发送者将封装好的数据发送到下一个节点,直到到达消息的最终目的地。
4. 数据接收:接收者根据协议解析接收到的数据包或帧,提取出消息内容,并进行相应的处理。
5. 反馈和确认:接收者可以向发送者发送确认消息,以确保消息的可靠传输。
如果发送者在一定时间内没有收到确认消息,可以选择重新发送消息或执行其他处理。
6. 错误处理:在传输过程中,可能会出现数据丢失、损坏或重复等错误。
发送者和接收者可以利用校验和、序列号等机制来
检测和纠正这些错误。
7. 消息完整性和安全性:为了确保消息传输的完整性和安全性,可以使用加密、认证等方法来保护数据的隐私和完整性。
总的来说,消息传输的工作原理基于网络传输协议和相关算法,通过数据封装、路由选择、数据传输、数据接收、反馈和确认、错误处理以及消息完整性和安全性保障等步骤,将消息从发送者传递给接收者。
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消息机制的工作原理可以分为以下几个步骤:
1. 发送消息:当一个应用程序需要发送消息到另一个应用程序时,它会调用Windows API中的SendMessage函数或者PostMessage函数。
这些函数会将消息传递给操作系统内核,并将消息发送到目标应用程序的消息队列中。
2. 消息队列:每个应用程序都有一个消息队列,它用于存储来自其他应用程序的消息。
Windows操作系统会在后台自动地维护这些消息队列,并当应用程序准备好时通知它们有新的消息到达。
3. 消息循环:每个应用程序都有一个消息循环,它用于获取来自消息队列的消息并将其传递给相应的消息处理程序。
当操作系统通知应用程序有新的消息到达时,应用程序会从消息队列中获取消息并将其传递给消息循环。
4. 处理消息:每个应用程序都有一个消息处理程序,它用于处理来自其他应用程序的消息。
当消息循环从消息队列中获取到消息时,它会将消息传递给相应的
消息处理程序进行处理。
总之,Windows消息机制利用了操作系统层面的消息队列和消息循环来实现应用程序之间的通信和交互。
这种机制可以帮助开发者实现非常灵活的应用程序,并且非常适合多任务处理和多线程应用。
用户是如何跟应用软件打交道的我们来看看,用户究竟是如何与应用软件打交道的(用户不需要知道这个具体过程,但应用软件的开发人员必须知道),如下图所示:从上图可以看到:在物理上,离用户最近的实际上是输入输出设备,下面我们看看上图中1-6这六个步骤分别表示什么意思(为了简便,在叙述时,我们的标号没有用圆圈):1. 用户点击鼠标或者键盘;2. Windows感觉到了鼠标或键盘的动作;3. Windows把这个消息告诉应用程序;4. 应用程序告诉Windows去做事,实际上就是应用程序调用Windows的API函数;5. Windows让输出设备做事;6. 用户获得输出。
对用户来说,没有必要了解输入输出设备和Windows的相关知识。
对程序员(写应用程序的人)来说,没有必要了解输入输出设备,但是必须了解Windows的基本知识。
在下面的叙述中,我们就不管输入输出设备了。
上面的过程还是很笼统,为了弄得更清楚,我们有必要了解Windows的消息机制,如图:下面,我们来慢慢描述(上图中的虚线表示消息的流程):step0: 程序员编程,把WinMain函数和窗口回调函数写好;step1: Windows调用WinMain函数,启动应用程序,Windows会建立一个消息队列,用来存储消息。
step2: WinMain函数调用Windows的API函数,比如调用CreateWindow和ShowWindow, 从而生成并显示一个窗口。
在调用CreateWindow函数时,会产生一个消息,这个消息并不进入消息队列,但窗口的回调函数仍然会处理,在此,我们不讨论非队列消息。
step3: WinMain函数调用Windows的API函数,比如调用GetMessage来从消息队列中取出消息。
假设用户这个时候在窗口中点击鼠标,那么Windows会把这个事件包装成消息,投到消息队列中,GetMessage会取出这个消息,通过DispatchMessage送到Windows;step4: Windows进而会将该消息发送到窗口的回调函数,并对该函数进行调用;step5:窗口的回调函数可以对这个消息进行相应处理,这个处理的具体方法由程序员自己决定,通常是调用Windows的API函数来实现处理。
Windows是一个消息(Message)驱动系统。
Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。
应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。
必须注意的是,消息并非是抢占性的,无论事件的缓急,总是按照到达的先后派对,依次处理(一些系统消息除外),这样可能使一些实时外部事件得不到及时处理。
Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视化的交互方式,窗口是总是在某个线程(Thread)内创建的。
Windows系统通过消息机制来管理交互,消息(Message)被发送,保存,处理,一个线程会维护自己的一套消息队列(Message Queue),以保持线程间的独占性。
队列的特点无非是先进先出,这种机制可以实现一种异步的需求响应过程。
目录:1、消息2 、消息类型3 、消息队列(Message Queues)4 、队列消息(Queued Messages)和非队列消息(Non-Queued Messages)5 、PostMessage(PostThreadMessage), SendMessage6 、GetMessage, PeekMessage7 、TranslateMessage, TranslateAccelerator8、(消息死锁( Message Deadlocks)9、BroadcastSystemMessage10、消息的处理11、MFC的消息映射12、消息反射机制1、消息消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。
一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了。
例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。
消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。
例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。
这个记录类型叫做MSG,MSG含有来自windows应用程序消息队列的消息信息,它在Windows中声明如下:typedefstructtagMsg{HWND hwnd; // 接受该消息的窗口句柄UINT message; // 消息常量标识符,也就是我们通常所说的消息号WPARAM wParam; // 32位消息的特定附加信息,确切含义依赖于消息值LPARAM lParam; // 32位消息的特定附加信息,确切含义依赖于消息值DWORD time; // 消息创建时的时间POINT pt; // 消息创建时的鼠标/光标在屏幕坐标系中的位置}MSG;消息可以由系统或者应用程序产生。
系统在发生输入事件时产生消息。
举个例子, 当用户敲键, 移动鼠标或者单击控件。
系统也产生消息以响应由应用程序带来的变化, 比如应用程序改变系统字体,改变窗体大小。
应用程序可以产生消息使窗体执行任务,或者与其他应用程序中的窗口通讯。
2、消息类型1) 系统定义消息(System-Defined Messages)在SDK中事先定义好的消息,非用户定义的,其范围在[0x0000, 0x03ff]之间,可以分为以下三类:1> 窗口消息(Windows Message)与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。
可以是一般的窗口,也可以是Dialog,控件等。
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE,WM_CTLCOLOR, WM_HSCROLL...2> 命令消息(Command Message)与处理用户请求有关,如单击菜单项或工具栏或控件时,就会产生命令消息。
WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。
如果是控件, HIWORD(wParam)表示控件消息类型3> 控件通知(Notify Message)控件通知消息,这是最灵活的消息格式,其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。
NMHDR包含控件通知的内容,可以任意扩展。
2) 程序定义消息(Application-Defined Messages)用户自定义的消息,对于其范围有如下规定:WM_USER: 0x0400-0x7FFF (ex. WM_USER+10)WM_APP(winver> 4.0): 0x8000-0xBFFF (ex.WM_APP+4) RegisterWindowMessage: 0xC000-0xFFFF3、消息队列(Message Queues)Windows中有两种类型的消息队列1) 系统消息队列(System Message Queue)这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理2) 线程消息队列(Thread-specific Message Queue)每一个GUI线程都会维护这样一个线程消息队列。
(这个队列只有在线程调用GDI函数时才会创建,默认不创建)。
然后线程消息队列中的消息会被送到相应的窗口过程(WndProc)处理.注意:线程消息队列中WM_PAINT,WM_TIMER只有在Queue中没有其他消息的时候才会被处理,WM_PAINT消息还会被合并以提高效率。
其他所有消息以先进先出(FIFO)的方式被处理。
4、队列消息(Queued Messages)和非队列消息(Non-Queued Messages)1)队列消息(Queued Messages)消息会先保存在消息队列中,消息循环会从此队列中取消息并分发到各窗口处理、如鼠标,键盘消息。
2) 非队列消息(NonQueued Messages)消息会绕过系统消息队列和线程消息队列直接发送到窗口过程被处理如:WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR,WM_WINDOWPOSCHANGED注意: postMessage发送的消息是队列消息,它会把消息Post到消息队列中;SendMessage发送的消息是非队列消息,被直接送到窗口过程处理.队列消息和非队列消息的区别从消息的发送途径来看,消息可以分成2种:队列消息和非队列消息。
消息队列由可以分成系统消息队列和线程消息队列。
系统消息队列由Windows维护,线程消息队列则由每个GUI线程自己进行维护,为避免给non-GUI现成创建消息队列,所有线程产生时并没有消息队列,仅当线程第一次调用GDI函数时系统才给线程创建一个消息队列。
队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。
对于队列消息,最常见的是鼠标和键盘触发的消息,例如WM_MOUSERMOVE,WM_CHAR等消息,还有一些其它的消息,例如:WM_PAINT、WM_TIMER和WM_QUIT。
当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就会把这些事件转换成相应的消息,然后输送到系统消息队列,由Windows系统去进行处理。
Windows系统则在适当的时机,从系统消息队列中取出一个消息,根据前面我们所说的MSG消息结构确定消息是要被送往那个窗口,然后把取出的消息送往创建窗口的线程的相应队列,下面的事情就该由线程消息队列操心了,Windows开始忙自己的事情去了。
线程看到自己的消息队列中有消息,就从队列中取出来,通过操作系统发送到合适的窗口过程去处理。
一般来讲,系统总是将消息Post在消息队列的末尾。
这样保证窗口以先进先出的顺序接受消息。
然而,WM_PAINT是一个例外,同一个窗口的多个WM_PAINT被合并成一个WM_PAINT 消息, 合并所有的无效区域到一个无效区域。
合并WM_PAIN的目的是为了减少刷新窗口的次数。
(xys---该图是关闭窗口的整个消息流程,从点击关闭按钮开始)非队列消息将会绕过系统队列和消息队列,直接将消息发送到窗口过程,。
系统发送非队列消息通知窗口,系统发送消息通知窗口。
例如,当用户激活一个窗口系统发送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。