学习鼠标编程和wingdows消息机制

合集下载

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是消息发送时鼠标所在的位置。

第5讲 Windows消息机制及HOOK应用

第5讲 Windows消息机制及HOOK应用
过程 1.编写消息处理模块HookProc LRESULT CALLBACK HookProc 2.编写HOOK管理程序,负责管理HookProc 把HookProc挂接到消息处理队列中(顶端) 从消息处理队列中删除HookProc 。
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系统的消息机制资料

第1章 Windows系统的消息机制对诸如PowerBuilder(后文简写为PB)、Visual Basic和Dephi等大多数可视化程序设计语言来讲,程序设计的核心是对象的事件、属性和方法,但对Windows系统本身而言,却是以消息处理为其控制机制。

Windows把系统中的对象都作为窗口来对待,每个窗口都有一个用来标识其身份的句柄。

Windows通过向窗口发送消息,在开发语言中转化为对象的事件,然后驱动对象,响应用户的动作。

在许多面向对象的可视化程序设计语言中,Windows的众多消息已经演变成了对象的属性或方法。

本章内容包括Windows系统的消息机制、消息的发送、消息的应用实例等。

1.1 Windows的工作机制1.1.1 Windows 的工作方式——窗口、事件和消息全面地讨论Windows的内部工作机制需要很大的篇幅,对于一般的PB用户当然没有必要深入了解所有的技术细节。

Windows系统的工作机制,简单地说就是3个关键的概念:窗口、事件和消息。

不妨简单地将窗口看做带有边界的矩形区域。

读者也许已经了解多种不同类型的窗口,如Windows系统的“资源管理器”窗口、文字处理程序中的文档窗口或者弹出提示有约会信息的消息对话框窗口等。

除了这些最普通的窗口外,实际上还有许多其他类型的窗口。

命令按钮是一个窗口,图标、文本框、选项按钮和菜单条也都是窗口。

Windows 操作系统通过给每一个窗口指定一个惟一的标识号(窗口句柄,常用hWnd表示)来管理所有的窗口。

操作系统连续地监视每一个窗口的活动或事件的信号。

事件可以通过诸如单击鼠标或按下按键的操作而产生,也可以通过程序的控制而产生,甚至可以由另一个窗口的操作而产生。

每发生一次事件,将引发一条消息发送至操作系统。

操作系统处理该消息并广播给其他窗口。

然后,每一个窗口才能根据自身处理该条消息的指令而采取适当的操作(例如,当窗口解除了其他窗口的覆盖时,重新绘制自身窗口)。

windows消息原理

windows消息原理

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

第7章 Windows中的键盘与鼠标消息

第7章 Windows中的键盘与鼠标消息
2009年1月 重庆理工大学计算机科学与技术系 共5页第5页
– 重复计数位(0~15位):当前消息的重复次数。 – OEM扫描码(16~23位):跟设备相关,忽略。 – 扩展键标志(24位):对于IBM增强键盘。 – 保留位(25~28位):记录某键跟Alt的组合状态。 – 关联码(29位): – 键的先前状态(30位): – 转换状态(31位):
• WinMain函数的消息循环中包含了TranslateMessage函数,它 的主要功能是把按键消息转换为字符消息,但只有当键盘驱动 程序把键盘字符映射成ASCII码后才能产生WM_CHAR消息,键盘 消息同样分为系统的和非系统的(教材P153表7-3); • 键盘消息应用举例:参见例题7-1。
– 按键消息:按下或释放 – 字符消息:产生可显示的字符
• 按键消息又分为(教材P152表72):
– 系统按键消息(ALT+?) – 非系统按键消息 2009年1月 重庆理工大学计算机科学与技术系
抽象过程示意图
共5页第2页
7பைடு நூலகம்1
键盘消息(续)
• 按键消息相关的两个变量wParam和lParam中包含了许多重要的 信息:
case– 不监测Shift和Ctrl键时一般用如下代码: WM_LBUTTONDOWN: //按下鼠标左键 ... break; case WM_LBUTTONUP: //释放鼠标左键 ... break;
• 两个有用的函数: – SetCapture():可实现对鼠标的捕获; – ReleaseCapture():释放鼠标。 • 鼠标消息应用举例:参见例题7-2。
2009年1月 重庆理工大学计算机科学与技术系 共5页第3页
7.2
鼠标消息

Visual C++MFC入门教程(经典版)

Visual   C++MFC入门教程(经典版)

Visual C++MFC入门教程(经典版)visual-c++mfc入门教程(经典版)木有页眉visualc++mfc入门教程目录+--第一章vc入门|------1.1如何学好vc|------1.2认知windows消息机制|------1.3利用visualc++/mfc开发windows程序的优势|------1.4利用mfc进行开发的通用方法介绍|------1.5mfc中常用类,宏,函数介绍+--第二章图形输出|------2.1和gui有关的各种对象|------2.2在窗口中输入文字|------2.3使用点,刷子,笔进行绘图|------2.4在窗口中绘制设备有关图形,图标,设备毫无关系图形|------2.5采用各种态射方式|------2.6多边形和剪贴区域+--第三章文档视结构|------3.1文档视图框架窗口间的关系和消息传送规律|------3.2接收用户输入|------3.3使用菜单|------3.4文档,视,框架之间相互作用|------3.5利用序列化展开文件读取|------3.6mfc中所提供更多的各种视类了解+--第四章窗口控件|------4.1button|------4.2staticbox|------4.3editbox|------4.4scrollbar|------4.d利用appwizard创建并使用toolbarstatusbardialogbar|------4.egeneralwindow|------4.f关于wm_notify的采用方法+--第五章对话框|------5.1使用资源编辑器编辑对话框|------5.2创建有模式对话框|------5.3创建无模式对话框|------5.4在对话框中展开消息态射|------5.5在对话框中进行数据交换和数据检查1木有页眉|------5.6采用属性对话框|------5.7采用通用型对话框|------5.8建立以对话框为基础的应用|------5.9使用对话框作为子窗口+--第六章网络通信开发|------6.1winsock介绍|------6.2利用winsock展开并无相连接的通信+------6.3利用winsock创建存有相连接的通信《visualc++开发指南》闻怡洋/文第一章vc入门1.1如何努力学习vc这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。

windows鼠标消息触发及其处理流程

windows鼠标消息触发及其处理流程

windows鼠标消息触发及其处理流程Windows操作系统是目前最常用的个人计算机操作系统之一,它提供了丰富的功能和便捷的用户界面。

鼠标作为计算机的重要输入设备,对于Windows系统而言也起着至关重要的作用。

本文将从鼠标消息触发及其处理流程的角度,为读者详细介绍Windows系统中鼠标消息的处理过程。

一、鼠标消息的触发在Windows系统中,鼠标消息的触发是由用户对鼠标的操作所引起的。

比如,当用户点击鼠标左键、右键或滚轮时,系统会通过硬件设备捕捉到对应的鼠标消息,并将其发送给操作系统。

二、鼠标消息的处理流程1. 消息捕捉:当用户操作鼠标时,硬件设备会将对应的消息传递给操作系统。

操作系统会通过相应的驱动程序对鼠标消息进行捕捉。

2. 消息分发:操作系统会将捕捉到的鼠标消息分发给当前活动的窗口。

如果用户操作的是桌面或任务栏等系统级界面,那么鼠标消息将由相应的系统进程进行处理。

3. 消息处理:窗口接收到鼠标消息后,会根据消息的具体类型进行相应的处理。

常见的鼠标消息类型包括鼠标移动、鼠标点击、鼠标释放等。

4. 消息响应:窗口在处理完鼠标消息后,会根据需要执行相应的操作或者触发相应的事件。

比如,当用户点击鼠标左键时,窗口可能会执行某个按钮的点击事件。

5. 消息传递:在消息响应过程中,窗口可能需要将鼠标消息传递给其他窗口进行处理。

这个过程通过消息传递机制来实现,比如通过SendMessage函数将消息传递给指定的窗口。

6. 消息绘制:在消息处理过程中,窗口可能需要进行界面的绘制操作,以反馈给用户。

比如,当用户在窗口上移动鼠标时,窗口可能需要更新鼠标所在位置的显示状态。

7. 消息返回:在消息处理完毕后,窗口会返回消息处理结果给操作系统。

操作系统可以根据返回结果进行相应的处理,比如更新鼠标光标的位置。

通过以上的处理流程,Windows系统能够有效地响应用户对鼠标的操作,并进行相应的处理。

这种鼠标消息的触发和处理机制,为用户提供了便捷的操作体验,使得人机交互更加顺畅。

windows编程原理

windows编程原理

windows编程原理Windows编程是指在Windows操作系统上进行软件开发的过程。

Windows操作系统是面向图形用户界面的操作系统,因此Windows编程主要涉及图形用户界面的设计和交互逻辑的实现。

Windows编程的原理包括以下几个核心概念:1. 窗口:Windows编程的核心是窗口的管理。

窗口是用户界面的基本单元,可以包含控件和其他组件。

窗口有不同的类型,如主窗口、对话框、工具栏等,每个窗口都有唯一的标识符。

2. 消息:在Windows编程中,窗口之间通过消息进行通信。

消息是Windows系统传递给应用程序的事件,如键盘输入、鼠标点击等。

每个窗口都有一个消息处理函数,用于处理接收到的消息。

3. 控件:控件是窗口中的可视化元素,用于实现用户界面的各种功能。

常见的控件包括按钮、文本框、列表框等。

控件可以通过事件处理函数来响应用户操作。

4. 资源:Windows编程中使用资源文件来存储应用程序的资源,如图像、音频、字符串等。

资源文件可以在程序运行时被加载和使用。

5. API函数:Windows编程使用Windows API函数来实现与操作系统的交互。

API函数提供了大量的功能,如创建窗口、处理消息、绘制图形等。

可以使用编程语言(如C++、C#等)来调用这些API函数。

在Windows编程中,开发者可以选择使用不同的编程语言和框架来进行开发。

最常用的编程语言包括C++、C#、 等,常用的框架包括MFC、WinForms、WPF等。

开发者可以根据自己的需求和熟悉程度选择合适的编程语言和框架。

总之,Windows编程是一种基于Windows操作系统的软件开发过程,涉及窗口管理、消息传递、控件操作等核心概念。

开发者需要熟悉Windows API函数和相应的编程语言来进行开发工作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

示例2:采用鼠标橡皮筋技术画圆
鼠标橡皮筋技术画圆就是采用圆心和圆周上任一点画 圆技术(简称C+P方法),首先用鼠标左击选择圆心位置,然 后移动鼠标,圆随鼠标移动而扩大或缩小,当再次单击鼠 标左键时,确定圆周上的一点,从而画出相应的圆。直线、 矩形等基本图形都可以采用橡皮筋技术。 第一步:建立MouseSpring工程文件; 第二步:向视图类中添加自定义的成员变量 用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。 proctected : CPoint m_bO; // 圆心 CPoint m_bR; //圆上的点 int m_ist; //圆心与圆周上点的区别,m_ist=0,表示鼠
标左击点为圆心,m_ist=1,表示鼠标左击点为圆周上的点
操作方法如图2-13所示,分别添加上述三个成员变量。
图2-13 添加成员变量
第三步:向视图类中添加自定义的成员函数原型:
public: void DrawCircle(CDC* pDC, CPoint cenp, CPoint ardp); int ComputeRadius(CPoint cenp,CPoint ardp); 具体操作方法:用鼠标右键单击视图类,选择“Add Member Function…”,如图2-14所示。分别添加上述两个 成员函数,分别用于画圆和计算圆的半径。
and/or call default
CDC *pDC=GetDC(); pDC->SelectStockObject(NULL_BRUSH); if (!m_ist) //绘制圆 { m_bO=m_bR=point; //纪录第一次单击鼠标位置,定圆心 m_ist++; }
else { m_bR=point; //记录第二次单击鼠标的位置,定圆周上的点 m_ist--; // 为新绘图作准备 DrawCircle(pDC,m_bO,m_bR); //绘制新圆 } ReleaseDC(pDC); //释放设备环境 CView::OnLButtonDown(nFlags, point); } void CMouseSpringView::OnMouseMove(UINT nFlags, CPoint point) {
nFlags参数中包含了鼠标按钮和键盘组合使用标志, 用来描述鼠标按钮和键盘上的Shift键和Ctrl键的组合 状态。nFlag参数取值范围: MK_LBUTTON:鼠标左键被按下; MK_RBUTTON:鼠标右键被按下; MK_MBUTTON:鼠标中键被按下; MK_SHIFT:键盘上的Shift键被按下; MK_CONTROL:键盘上的Ctrl键被按下; 如果想知道某个键是否被按下,可用对应的位屏蔽 值与nFlags参数作按位逻辑“与”运算,所的结果若 为非零值,则表示该按钮被按下,例如:
if (nFlags & LBUTTON) AfxMessageBox(“LButton is pressed down!”) Else AfxMessageBox(“LButton is pressed Up!”); 如何区分两次单击和一次双击,这取决于两次按下 按钮之间的时间间隔,只有当时间间隔小于一定值时 才被认为是Windows默认的时间为500ms。可以用 SetDoubleClickTime()函数来重新设置时间间隔值。 若要使窗口函数能接收到鼠标双击产生的消息,在 注册窗口类时,必须指明该窗口具有CS_DBLCLKS风 格,否则,即使进行了双击操作,该窗口也只能收到 两条“WM_LBUTTONDOWN”和 “WM_LBUTTONUP”消息,例如: wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_D BLCLKS;
void CMouseView::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC->TextOut(20,80,"LButton is double clicked!"); CView::OnLButtonDblClk(nFlags, point); } void CMouseView::OnRButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC->TextOut(20,80,"RButton is double clicked!"); CView::OnRButtonDblClk(nFlags, point); } 第五步:编译程序,并验证执行结果。
其中,阴影部分是用户输入的程序,其它内容都 是自动生成的内容。
第四步:重复第二步和第三步,分别添加
WM_LBUTTONUP,WM_MOUSEMOVE, WM_RBUTTONDOWN,WM_RBUTTONUP, WM_LBUTTONDBCLK, WM_RBUTTONDBCLK 鼠标事件,并输入以下程序: void CMouseView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC->TextOut(20,40,"LButton UP!"); CView::OnLButtonUp(nFlags, point); }
第六步:向视图类中添加两个鼠标消息响应函数, 并输入鼠标处理程序代码。
具体操作方法与鼠标示例1方法相同。一个是 OnLButtonDown()函数,另一个是OnMouseMove()函数。 程序如下: void CMouseSpringView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here
void CMouseView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC->TextOut(20,60,"RButton Down!"); CView::OnRButtonDown(nFlags, point); } void CMouseView::OnRButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC->TextOut(20,40,"RButton UP!"); CView::OnRButtonUp(nFlags, point); }
2.3.3 鼠标编程综合示例
示例1:在窗口中以文本的形式给出鼠标 的状态,即当鼠标移动时,给出鼠标的位置; 当鼠标按下鼠标左、右键时显示出鼠标按键状 态。例如,当鼠标左键按下时,显示 “LBUTTON DOWN!”。 第一步:建立一个myMouse工程文件; 第二步:添加鼠标事件处理函数 鼠标右击视图类(如CmyMouseView), 选择“add windows message handler…”, 弹出事件处理函数列表窗口,如图2-11所示
图2-11
Windows事件处理函数列表窗口
从左边事件消息列表中选择 “WM_LBUTTONDOWN”,然后单击“Add and Edit” 按钮,即加入鼠标左键按下事件函数,并要求编辑事件处 理程序。
第三步:输入事件处理程序
void CMymouseView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default //获得pDC CDC* pDC=GetDC(); pDC->CView::TextOut(20,40,”LBUTTONDOWM!”); // 输出显示信息 OnLButtonDown(nFlags, point); }
图2-14
添加成员函数
第四步:在视图类CPP文件的构造函数中初始化成员变量
视图类的构造函数名与该视图类的名字相同。在视 图类中选择构造函数,如:CMouseSpringView(),用 鼠标左键双击,输入下面程序代码: CMouseSpringView:: CMouseSpringView() { //TODO: add construction code here m_bO.x=0; m_bO.y=0; //圆心 m_bR.x=0; m_bR.y=0; //圆上的点 m_ist=0; //圆心与圆上的点区别 }
void CMouseView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); char tbuf[80]; sprintf(tbuf,"Position:(%3d,%3d)",point.x,point.y); // 输出鼠标当前位置 pDC->TextOut(20,20,tbuf); CView::OnMouseMove(nFlags, point); }
相关文档
最新文档