Windows 消息机制的研究和应用
Windows编程实验二实验报告
Windows编程实验二实验报告一、实验目的本次 Windows 编程实验的目的在于深入了解和掌握 Windows 应用程序的开发流程,通过实际编程操作,提高对 Windows 消息机制、窗口处理、图形绘制等方面的理解和应用能力。
二、实验环境操作系统:Windows 10开发工具:Visual Studio 2019编程语言:C++三、实验内容1、窗口创建与消息处理创建一个基本的 Windows 窗口,并实现对窗口消息(如WM_CREATE、WM_PAINT、WM_DESTROY 等)的处理。
通过响应这些消息,完成窗口的初始化、绘制和关闭操作。
2、图形绘制在窗口客户区进行简单的图形绘制,如直线、矩形、圆形等。
掌握GDI(图形设备接口)的基本绘图函数和操作方法。
3、菜单与控件添加菜单到窗口,并处理菜单命令消息。
同时,尝试在窗口中添加一些基本的控件,如按钮、编辑框等,并实现相应的交互功能。
四、实验步骤1、创建项目打开 Visual Studio 2019,创建一个新的 Windows 桌面应用程序项目。
选择 C++作为编程语言,并按照向导进行设置,包括项目名称、存储位置等。
2、窗口类定义定义一个窗口类(WNDCLASS),设置窗口的样式、窗口过程函数指针等属性。
```cppWNDCLASS wndClass ={ 0 };wndClasslpfnWndProc = WndProc;wndClasshInstance = hInstance;wndClasslpszClassName = L"MainWindowClass";RegisterClass(&wndClass);```3、窗口创建与显示使用`CreateWindow` 函数创建窗口,并通过`ShowWindow` 和`UpdateWindow` 函数显示窗口。
```cppHWND hWnd = CreateWindow(L"MainWindowClass",L"Windows Programming Experiment",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);```4、消息循环在主函数中,通过一个无限循环来获取和分发窗口消息。
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等。
操作系统实验报告6
操作系统实验报告6一、实验目的本次操作系统实验的主要目的是深入了解和掌握操作系统中进程管理、内存管理、文件系统等核心概念和相关技术,通过实际操作和观察,增强对操作系统工作原理的理解,并提高解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,实验工具包括 Visual Studio 2019 等。
三、实验内容(一)进程管理实验1、创建多个进程,并观察它们的运行状态和资源占用情况。
通过编写简单的C++程序,使用Windows API 函数创建多个进程。
在程序中,设置不同的进程优先级和执行时间,观察操作系统如何调度这些进程,以及它们对 CPU 使用率和内存的影响。
2、进程间通信实现了进程间的管道通信和消息传递。
通过创建管道,让两个进程能够相互交换数据。
同时,还使用了 Windows 的消息机制,使进程之间能够发送和接收特定的消息。
(二)内存管理实验1、内存分配与释放使用 C++的动态内存分配函数(如`malloc` 和`free`),在程序运行时动态申请和释放内存。
观察内存使用情况,了解内存碎片的产生和处理。
2、虚拟内存管理研究了 Windows 操作系统的虚拟内存机制,通过查看系统的性能监视器,观察虚拟内存的使用情况,包括页面文件的大小和读写次数。
(三)文件系统实验1、文件操作进行了文件的创建、读取、写入、删除等基本操作。
通过编写程序,对不同类型的文件(如文本文件、二进制文件)进行处理,了解文件系统的工作原理。
2、目录操作实现了目录的创建、删除、遍历等功能。
了解了目录结构在文件系统中的组织方式和管理方法。
四、实验步骤(一)进程管理实验步骤1、打开 Visual Studio 2019,创建一个新的 C++控制台项目。
2、在项目中编写代码,使用`CreateProcess` 函数创建多个进程,并设置它们的优先级和执行时间。
3、编译并运行程序,通过任务管理器观察进程的运行状态和资源占用情况。
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编程有⼀个规则,就是只能通过创建控件的线程来操作控件的数据,否则就可能产⽣不可预料的结果。
Windows消息循环机制研究
2 消息驱动 : no s ) Widw 应用程序 的另一特点就是基于消息驱动 。用户通过应用程序界面上的菜单栏 、 工具栏进 行各 种操作 , 这 些操作触 发各种事件 , 事件 以消息的形式交给应用程序来处理 , 应用程序通过对这些消息的响应来 实现用户 的需求。 Wid w 应用程序的这些特点很适合于用户 的操作习惯 , nos 软件的使用变得简单灵活 , 同时 , 了方便 Widw 平 台下 的应用程 为 nos 序开发 , 微软对操作 系统 的功能进行 了封装 , 提供 了一套完整的接 口函数供软件开发人员使用 , 这就是 Widw 应用程序接 口( n no s wi
3操作 系统捕获事件 , ) 将其封装成消息 , 并放 到与该应用程序相关的消息队列 中。 4 应用程序从消息队列获取消息 , ) 然后转换消息 , 派遣消息 。 . 5 应用程序将消息派遣给操作 系统 , ) 操作 系统调用应用程序注册 的回调 函数对消息进行处理 。
在 整个 应 用 程 序 运 行 过 程 中需 要 强 调 以下 两 点 :
消息呢?可以调用 系统 函数 P s u Mesg( ; ot i sae ) Q t 0 来触发 WM— U T Q I 消息 。 2 消息处理机制 : ) 消息 的处理是在 回调函数中进行 的 , 需要注意的是 回调函数是在设计 窗 E类时 由软件开发人员指定的 , l 回调
关 键 词 : 息循 环 ; 消 图形 用 户界 面 ; 调 函数 ; 息 队 列 回 消 中图 分 类 号 : P 1 文 献标 识 码 : 文章 编 号 :0 9 3 4 (0 22 — 0 6 0 T 36 A 10 — 042 1 )5 6 3 — 4
深入分析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。同时 , 用户 能定义 自己的消息名称 , 也能利用 自定 义 消息来 发送通知和 传送数据 。
Windows消息机制研究
Wid w 消 息 机 制 中 的 消 息 是 由 几 个 特 定 涵 义 n0s 总 第 的数据 组成 的结构 体 , 的组成结 构如 下 : 它
二
tp de tu ttg G y e fsrc a MS
图 1 消 息 流 程 图
图 2 消 息 循 环 图
赡 应 消 息
3 消 息 的 处 理
线 程和 进程 利用 消息 循环 将 消息放 入 消息 队列 中 下面是 WiMan函数末 端应 用 程序 消息循 环 的 n i
典 型 示 例
Whl(eMesg( gN L0o) i G t sae&ms,UL 。,)/从 消息 队列 中取 e / 出一条 消息
.
维普资讯
竺 竺
窗 口 回调 函 数 :
L S L AL B CK Wn Po ( RE U T C L A d rc HWN Wn ,U NT Dh d I m s g , A A P rm L A A aa ) es e WP R M w a , P R M 1 rm a a P { { 根据 消息类 型 做相应 的处 理} ; l
维普资讯
Wid w n o s消 息机 制研 究
王 亚 . 宋 铭 利
( 洛阳师 范学院计 算机科 学系 , 洛阳 4 1 2 ) 7 0 2
摘
要 :在 Wid ws 息的 产 生 、 本格 式、 no 消 基 传递 、 处理 等 方 面对 W id ws消 息机 制进 行 阐 no 述, 并介 绍在 vc++60下 自定 义消 息 的基本 过程 , . 以及 利 用剪 贴板 和原 子表 结合 消
Windows消息机制及其辅助研究工具设计
p iC“ B i e 等 , 由这 些 不 同语 言 开 发 的软 件 有 一 点 h、 ul r 但 d 却 是 相 同 的 , 均 运 行 于 W id ws平 台 上 , 必 须 符 合 即 no 也
Wid ws的运 行 机 制 。作 为 W id ws 作 系 统 基 础 的 消 no no 操 息 机 制 也 就 必 然 为众 多 用 不 同语 言 开 发 的 Wid ws操 作 no
较为深入的剖析 。
消 息 循 环 中 非 常 重 要 的 一 个 函 数 是 GeMes g , t sa e 从
1 W id ws消 息 机 制 no
1 1 消 息 的 含 义 .
此 函 数 调 用 开 始 。 该 函 数 从 消 息 队 列 中 抓 取 消 息 。 在 接
收 到一 个 消息 后 , Di ac Me sg 由 s th sa e函 数 将 获 取 的 wi— p n d ws消 息 传 送 给 有 结 构 MS 中 h d指 定 的 窗 口所 对 o G wn 所 谓 Wid ws消 息 , 是 指 Wid ws 出 的一 个 通 no 就 no 发 知 , 知 应 用 程 序 某 个 事 情 已 经 发 生 。例 如 , 标 单 击 、 通 鼠
工 具 多 种 多 样 , 行 的 有 Viu l 流 s a C” 、 s a Bai、 l Viu l sc De
W PARA M wPa a : rm
LPARA M Pa a : l rm
DW ( RD i e ) tm :
P( I T t )N p :
}M S , *PM S G G;
中 的时 间 , 这 个 域 中写 入 的并 非 当 时 日期 , 在 而是 从 W i— n
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平台上消息处理技术浅析
第33卷第8期湖南科技学院学报V ol.33 No.8 2012年8月Journal of Hunan University of Science and Engineering Aug.2012Windows平台上消息处理技术浅析谢智明(湖南科技学院 计算机与通信工程系,湖南 永州 425100)摘 要:本文介绍了在Windows平台上获取消息并进行处理的技术,举例说明了如何编写消息处理机制应用程序的步骤与方法。
关键词:hook;消息获取中图分类号:TP39文献标识码:A 文章编号:1673-2219(2012)08-0046-031 hook机制Windows系统建立在事件驱动的机制上,也就是整个系统都是通过消息的传递来实现的。
hook机制是一种特殊的消息处理机制,可以监视系统或进程中的各种事件消息,获取发往目标窗口的消息并进行处理。
这样,我们就可以在系统中安装自定义的hook,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
hook的种类很多,每种hook可以截获并处理相应的消息,如键盘hook可以截获键盘消息,外壳 hook可以截取、启动和关闭应用程序的消息等。
hook可以分为线程hook和系统hook, 线程hook监视指定线程的事件消息, 系统hook监视系统中的所有线程的事件消息。
因为系统hook会影响系统中所有的应用程序,所以hook函数必须放在独立的动态链接库(DLL) 中。
2 实现hook机制的关键技术2.1 windows的hook程序,需要用到几个sdk中的api函数下面列出这几个函数的原型及说明:hhook setwindowshookex(int idhook,hook_proc lpfn,hinstance hmod,dword dwthreadid);参数说明如下:idhook:hook的类型lpfn:hook处理函数地址hmod:包含hook函数的模块句柄dwthreadid:hook的监控线程函数说明:函数将在系统中挂上一个由idhook指定类型的hook,监控并处理相应的特定消息。
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消息机制是Windows操作系统中的核心特性之一,它允许不同的应用程序之间进行通信和交互。
当一个应用程序需要与另一个应用程序进行交互时,它可以发送一个消息到目标应用程序。
目标应用程序会接收这个消息并做出相应的处理。
Windows消息机制的工作原理可以分为以下几个步骤:
1. 发送消息:当一个应用程序需要发送消息到另一个应用程序时,它会调用Windows API中的SendMessage函数或者PostMessage函数。
这些函数会将消息传递给操作系统内核,并将消息发送到目标应用程序的消息队列中。
2. 消息队列:每个应用程序都有一个消息队列,它用于存储来自其他应用程序的消息。
Windows操作系统会在后台自动地维护这些消息队列,并当应用程序准备好时通知它们有新的消息到达。
3. 消息循环:每个应用程序都有一个消息循环,它用于获取来自消息队列的消息并将其传递给相应的消息处理程序。
当操作系统通知应用程序有新的消息到达时,应用程序会从消息队列中获取消息并将其传递给消息循环。
4. 处理消息:每个应用程序都有一个消息处理程序,它用于处理来自其他应用程序的消息。
当消息循环从消息队列中获取到消息时,它会将消息传递给相应的
消息处理程序进行处理。
总之,Windows消息机制利用了操作系统层面的消息队列和消息循环来实现应用程序之间的通信和交互。
这种机制可以帮助开发者实现非常灵活的应用程序,并且非常适合多任务处理和多线程应用。
消息分层处理机制在Windows应用程序开发中的应用
用钩子函数 , 这样系统运行速度将会 明显的减慢 . 此外 , 使用钩子函数的方法实际上 突破 了应用程序 的封装
性, 因为这样做就相当于在操作系统层面上做了处理 , 了目前应用程序的开发规范 . , 违背 因此 使用钩子函数
上 , 出了从应用 程序 窗 I层下降到应用程序框架层上去处 理消息 的解决方法 , 到了改 变某一 事件发 生时 提 = I 达
应用程序默认 的执行次序 的 目的. 关键词 : 消息机制 ; n o 程序设计 ; Wi ws d 事件
中图分类号 : P 1 T 31
文献标识码 : A
来解决这一问题并不是一个很好的策略. 本文提出了采用 Wi o s n w 开发平台上的消息分层处理机制来解决这个问题 . d
1 消息的分层处理机制分析
Wi o s n w 是一个基于事件、 d 消息驱动的操作系统 . 当发生按击键盘或 鼠标 的行为时 , n o s Wi w 都会辨认 d
息处理的范畴 .
目 前对于捕获键盘或鼠标等外部事件的常用做法就是采用钩子函数 . 钩子函数是 系统处理机制的一个 入 口点 , 通过它, 应用程序可以安装一个例程 , 来监视 系统的消息传递路线 , 对某种特定的消息在传递到
目 标窗 口之前进行响应[ . 在系统把消息传递给应用程序 的过程中先截获消息并在进行完 自己的处理后再
文章编 号 : 0— 7 {060— 6— 1 02 320 )1 0 1 4 0 0 0 0
0 问题的提 出
在 Wi o s n w 应用程序的编程 中, d 发现了这样一个 问题 : C+ B i e 开发环境里 , 在 + udr l 程序员 已为某一文 本框控件的 O E i n x 事件编写了代码 , t 在程序运行时用户中途想要退出程序 , 点击“ 退出” 按钮 , 而此时焦点恰 好还在文本框内. 当有这样 的情 况发生时, 用户无法正常退出程序. 本文把这一 问题称 之为 :失焦时屏蔽 “ O E i事件”用户在此处唯一进行的操作就是在按钮上点击 了鼠标 , Wi o s nx t . 对 n w 操作系统来说 , d 这属于消
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是消息发送时鼠标所在的位置。
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的消息来刷新窗⼝。
windows消息原理
windows消息原理Windows消息原理是Windows操作系统中一种实现进程间通信的机制。
当一个应用程序需要发送消息给另一个应用程序时,它会创建一个消息,并将该消息发送给目标应用程序的消息队列。
消息由消息标识、消息参数和消息回调函数组成。
消息标识用于识别消息的类型,每个消息标识都有一个唯一的整数值。
消息参数则用于传递附加的信息,例如鼠标位置、键盘按键等。
回调函数是接收消息并对其进行处理的函数。
当一个程序需要发送消息时,它会使用函数PostMessage或SendMessage来将消息发送给目标程序。
PostMessage函数将消息放入目标应用程序的消息队列中,并立即返回。
而SendMessage函数则会等待目标应用程序处理完消息后才返回。
接收消息的应用程序会不断从自己的消息队列中取出消息,并将其传递给消息回调函数进行处理。
回调函数根据消息类型进行相应的操作,例如更新界面、处理用户输入等。
处理完消息后,应用程序会继续处理下一个消息,直到消息队列为空。
消息机制的优点是它允许不同的应用程序之间进行松耦合的通信。
发送消息的应用程序不需要知道目标应用程序的具体实现细节,只需要知道消息标识和消息参数即可。
同时,由于消息的处理是异步的,应用程序可以同时处理多个消息,提高了系统的响应速度。
然而,消息机制也存在一些缺点。
首先,由于消息的传递是通过消息队列,因此消息的接收可能会有延迟。
另外,由于消息的处理是在接收消息的线程中进行的,如果处理消息的时间过长,会导致界面无响应或其他应用程序的操作延迟。
因此,需要合理设计消息的处理逻辑,避免长时间的阻塞操作。
总的来说,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系统是一个消息驱动的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; }}接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。
wpf stylet消息机制
wpf stylet消息机制WPF Stylet消息机制是一种用于构建Windows Presentation Foundation (WPF)应用程序的轻量级框架。
它提供了一种简单而强大的方式来处理应用程序中的消息传递和事件处理。
在本文中,我们将探讨WPF Stylet消息机制的工作原理和使用方法。
在WPF应用程序中,消息传递和事件处理是非常重要的。
消息传递是指在应用程序的各个组件之间传递消息和数据,而事件处理是指对用户输入或系统事件做出响应。
WPF Stylet消息机制提供了一种优雅的方式来处理这些任务。
在WPF Stylet中,消息是通过ViewModels之间的交互来传递的。
ViewModel是一个用于表示视图的数据和行为的类。
它负责处理视图的逻辑,并将结果传递给视图。
通过消息机制,ViewModels可以相互通信,以实现应用程序的各个部分之间的协调。
在WPF Stylet中,消息是通过MessageBus来传递的。
MessageBus 是一个全局的消息传递机制,它允许ViewModels之间发送和接收消息。
通过使用MessageBus,ViewModels可以解耦并独立于彼此工作,从而提高代码的可维护性和可扩展性。
使用WPF Stylet消息机制非常简单。
首先,我们需要定义一个消息类,该类用于封装消息的数据。
消息类通常包含一些属性,用于传递消息的数据。
然后,我们需要在发送消息的ViewModel中实例化一个消息对象,并将其发送到MessageBus。
接收消息的ViewModel 可以订阅该消息,并在接收到消息时执行相应的操作。
WPF Stylet消息机制支持不同类型的消息。
例如,我们可以发送简单的文本消息,也可以发送包含复杂数据结构的消息。
此外,WPF Stylet还支持消息的过滤和优先级设置。
通过使用这些功能,我们可以更好地控制消息的传递和处理。
除了消息传递,WPF Stylet还提供了一种简单而强大的事件处理机制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows 消息机制的研究和应用左春伟北京邮电大学计算机科学与工程系,北京 (100876)E-mail:zchw100@摘要:Windows 是基于消息的非可剥夺式操作系统,以事件为驱动。
通过消息循环接收处理各种事件,深入理解消息运行机理对于Windows编程至关重要。
本文首先探讨Windows 的消息运行机制,重点介绍消息循环,然后对MFC的消息映射机制进行分析,最后,给出一个MFC消息的灵活运用实例。
关键词:Windows消息,MFC,消息映射,事件中图分类号:TP-301.61.引言Windows 在操作系统平台占有绝对统治地位,基于Windows的编程和开发越来越广泛。
Dos是过程驱动的,而Windows是事件驱动的[6],这种差别的存在使得很多Dos程序员不能习惯Windows的程序开发。
而很多Windows程序开发人员也只是对消息运行机制一知半解,想要掌握Windows编程的核心,必须深刻理解消息机制。
事件驱动围绕着消息的产生与处理展开,事件驱动是靠消息循环机制来实现的。
也可以理解为消息是一种报告有关事件发生的通知,消息是Windows操作系统的灵魂,掌握了消息运行机制就掌握了Windows编程的神兵利器。
本文将首先阐述Windows的编程原理,继而对Windows的消息运行机制进行分析,并讲述对消息的处理。
MFC是一个广为使用的编程类库,对Windows的消息机制进行了良好的封装,所以,在第二部分将着重讨论MFC的消息映射,最后结合编程实际,通过对MFC消息映射的分析,非常巧妙的加以应用,以帮助解决实际问题。
2.Windows消息运行机制在介绍Windows消息运行机制之前,首先介绍一下消息的概念。
2.1消息的概念和表示消息(Message)指的就是Windows操作系统发给应用程序的一个通告[5],它告诉应用程序某个特定的事件发生了。
比如,用户单击鼠标或按键都会引发Windows系统发送相应的消息。
最终处理消息的是应用程序的窗口函数,如果程序不负责处理的话系统将会作出默认处理。
从数据结构[4]的角度来说,消息是一个结构体,它包含了消息的类型标识符以及其他的一些附加信息。
系统定义的结构体MSG[1]用于表示消息,MSG具有如下定义形式:typedef struct tagMSG{H WND hwnd;U INT message;W PARAM wParam;L PARAM lParam;D WORD time;P OINT pt;}MSG;其中hwnd是窗口的句柄,这个参数将决定由哪个窗口过程函数对消息进行处理;message 是一个消息常量,用来表示消息的类型;wParam和lParam都是32位的附加信息,具体表示什么内容,要视消息的类型而定;time是消息发送的时间;pt是消息发送时鼠标所在的位置。
2.2 Windows编程原理Windows是一消息(Message)驱动式系统,Windows消息提供了应用程序与应用程序之间、应用程序与Windows系统之间进行通讯的手段。
应用程序要实现的功能由消息来触发,并靠对消息的响应和处理来完成。
Windows系统中有两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。
计算机的所有输入设备由 Windows监控,当一个事件发生时,Windows先将输入的消息放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中,应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。
一个事件的发生,到达处理它的窗口函数必须经历上述过程。
所谓消息就是描述事件发生的信息,Windows程序是事件驱动的,用这一方法编写程序避免了死板的操作模式,因为Windows程序的执行顺序将取决于事件的发生顺序,具有不可预知性。
Windows操作系统,计算机硬件,应用程序之间具有如图1所示的关系[3]:图1 操作系统,应用程序和计算机硬件关系图箭头1说明操作系统能够操纵输入输出设备,例如让打印机打印;箭头2说明操作系统能够感知输入输出设备的状态变化,如鼠标单击,按键按下等,这就是操作系统和计算机硬件之间的交互关系,应用程序开发者并不需要知道他们之间是如何做到的,我们需要了解的操作系统与应用程序之间如何交互。
箭头3是应用程序通知操作系统执行某个具体的操作,这是通过调用操作系统的API来实现的;操作系统能够感知硬件的状态变化,但是并不决定如何处理,而是把这种变化转交给应用程序,由应用程序决定如何处理,向上的箭头4说明了这种转交情况,操作系统通过把每个事件都包装成一个称为消息结构体MSG来实现这个过程,也就是消息响应,要理解消息响应,首先需要了解消息的概念和表示。
2.3 Windows消息循环消息循环[1]是Windows应用程序存在的根本,应用程序通过消息循环获取各种消息,并通过相应的窗口过程函数,对消息加以处理;正是这个消息循环使得一个应用程序能够响应外部的各种事件,所以消息循环往往是一个Windows应用程序的核心部分。
Windows的消息机制如图2所示:图2 Windows消息机制Windows操作系统为每个线程维持一个消息队列,当事件产生时,操作系统感知这一事件的发生,并包装成消息发送到消息队列,应用程序通过GetMessage()函数取得消息并存于一个消息结构体中,然后通过一个TranslateMessage()和DispatchMessage()解释和分发消息,下面的代码描述了Windows的消息循环。
while(GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}TranslateMessage(&msg)对于大多数消息而言不起作用,但是有些消息,比如键盘按键按下和弹起(分别对于KeyDown和KeyUp消息),却需要通过它解释,产生一个WM_CHAR 消息。
DispatchMessage(&msg)负责把消息分发到消息结构体中对应的窗口,交由窗口过程函数处理。
GetMessage()在取得WM_QUIT之前的返回值都为TRUE,也就是说只有获取到WM_QUIT消息才返回FALSE,才能跳出消息循环。
2.4 消息的处理取得的消息将交由窗口处理函数进行处理,对于每个窗口类Windows为我们预备了一个默认的窗口过程处理函数DefWindowProc(),这样做的好处是,我们可以着眼于我们感兴趣的消息,把其他不感兴趣的消息传递给默认窗口过程函数进行处理。
每一个窗口类都有一个窗口过程函数,此函数是一个回调函数,它是由Windows操作系统负责调用的,而应用程序本身不能调用它。
以switch语句开始,对于每条感兴趣的消息都以一个case引出。
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){…switch(uMsgId){case WM_TIMER://对WM_TIMER定时器消息的处理过程return 0;case WM_LBUTTONDOWN://对鼠标左键单击消息的处理过程reurn 0;. …default:return DefWindowProc(hwnd,uMsgId,wParam,lParam);}}对于每条已经处理过的消息都必须返回0,否则消息将不停的重试下去;对于不感兴趣的消息,交给DefWindowProc()函数进行处理,并需要返回其处理值。
3. MFC的消息映射MFC是Windows下编程的微软基础类库,封装了大部分Windows API和Windows控件,提供了一套消息映射和命令响应机制,方便了应用程序的开发。
MFC只是通过对Windows 消息映射的进行封装,使得添加消息响应变得更为简单,但深究起来,与Windows消息机制有一样的底层实现。
3.1 MFC消息映射的实现在MFC的框架结构下,“消息映射”是通过巧妙的宏定义,形成一张消息映射表格来进行的。
这样一旦消息发生,Framework就可以根据消息映射表格来进行消息映射和命令传递。
首先在需要进行消息处理的类的头文件(.H)里,都会含有DECLARE_MESSAGE_MAP()宏,声明该类拥有消息映射表格。
然后在类应用程序文件(.CPP)实现这一表格BEGIN_MESSAGE_MAP(CInheritClass, CBaseClass)//{{AFX_MSG_MAP(CInheritClass)ON_COMMAND(ID_EDIT_COPY,OnEditCopy)………//}}AFX_MSG_MAPEND_MESSAGE_MAP()这里主要进行消息映射的实现,把它和消息处理函数联系在一起。
其中出现三个宏,第一个宏是BEGIN_MESSAGE_MAP有两个参数,分别是拥有消息表格的类,及其父类。
第二个宏是ON_COMMAND,指定命令消息的处理函数名称。
第三个是END_MESSAGE_MAP()作为结尾符号。
DECLARE_MESSAGE_MAP宏定义里包含了MFC定义的两个新的数据结构;AFX_MSGMAP_ENTRY和AFX_MSGMAP;其中AFX_MSGMAP_ENTRY结构包含了一个消息的所有相关信息,而AFX_MSGMAP主要作用有两个,一是用来得到基类的消息映射入口地址。
二是得到本身的消息映射入口地址。
实际上,MFC把所有的消息一条条填入到AFX_MSGMAP_ENTRY结构中去,形成一个数组,该数组存放了所有的消息和与它们相关的参数。
同时通过AFX_MSGMAP能得到该数组的首地址,同时得到基类的消息映射入口地址。
当本身对该消息不响应的时候,就可以上溯到基类的消息映射表寻找对应的消息响应。
MFC通过钩子函数_AfxCbtFilterHook()截获消息,并在此函数中把窗口过程函数设置为AfxWindProc,而原来的窗口过程函数被保存在成员变量m_pfnSuper中。
在MFC框架下,通过下面的步骤来对消息进行映射[7]。
1 函数AfxWndProc接收Windows操作系统发送的消息。
2 函数AfxWndProc调用函数AfxCallWndProc进行消息处理,这里一个进步是把对句柄的操作转换成对CWnd对象的操作。
3 函数AfxCallWndProc调用CWnd类的方法WindowProc进行消息处理。
4 WindowProc调用OnWndMsg进行正式的消息处理,即把消息派送到相关的方法中去处理。
5 如果OnWndMsg方法没有对消息进行处理的话,就调用DefWindowProc对消息进行处理。