《vc 鼠标原理》由会员分享,可在线阅读,更多相关《vc 鼠标原理(7页珍藏版)》请在金锄头文库上搜索。
1、鼠标原理鼠标原理鼠标是一种将人手的动作记录下来,通过电脑处理后再一点不漏地还原在显示器上并对电脑 进行担任的设备。 以常见的半光电结构的鼠标来说,当鼠标向左移动时,鼠标内部滚球受标挚垫的摩擦力而向 右侧滚动,带动垂直方向的转轴向左旋转,而转轴未端的圆盘光栅切割其侧面的红外线发光 管的光线。圆盘光栅另一侧的红外线接收管内沿上下方向排列了两个接收管,当上面的接收 管先于下面感受到红外线后,控制芯片产生向左(或向右)移动的信号,而当下面的接收管先 于上面的感受到红外线后,则产生向右(或向左)移动的信号。控制芯片再将这些方向信号调 制后送到计算机,在屏幕上正确还原出鼠标的移动,另外一组的水平转动装置同
2、样进行判断, 处理情况与水平方向完全相同。而当鼠标作斜方向移动时,水平和垂直两个方向的转动装置 同时输出信号,这样,屏幕上的鼠标箭头就可以随着手的移动满屏移动了。当按到鼠标的左、 右键时,微动开关的闭合将通断信号传给控制芯片,再转换为电脑可以识别的信号,鼠标的 基本原理大致如此。 鼠标是一个重要的,但可选的输入设备,好的应用程序应该包括鼠标接口,但不应该把鼠标 作为唯一的输入设备,而也应该提供完备的键盘支持。 鼠标光标鼠标光标当用户移动鼠标时,系统屏幕上的一个图形也跟着移动,这个图形就叫做鼠标光标。鼠 标光标包含一个单像素的点称为热点,系统根据该点移动或识别光标位置。当产生鼠标事件 时,包含热
3、点的窗口就会收到事件所产生的消息。接收消息的窗体没有必要是激活的窗体, 或者获取了键盘焦点。系统维护着控制鼠标移动速度的变量也就是,用户移动鼠标时,光标所移动的距离。 可以使用 SystemParametersInfo 函数并指定 SPI_GETMOUSE 或 SPI_SETMOUSE 标志以获 取或设置鼠标速度。更多关于光标的信息,请参见“光标”。鼠标捕获鼠标捕获当发生鼠标事件时,系统通常会把一个鼠标消息发送到包含鼠标热点的窗体中,应用程 序可以通过使用 SetCapture 函数把鼠标信息转而传递给指定的窗口。在调用 ReleaseCapture 或者指定另外一个捕获窗体,更一般的情况是用
4、户点击了其他线程创建的窗体前,该窗口就 会接收所有的鼠标信息。鼠标捕获改变时,系统就会给失去捕获的窗口发送 WM_CAPTURECHANGED 消息。 消息的 lParam 参数为获得捕获的窗体句柄。只有前台的窗体才可以捕获鼠标输入,如果后台窗体尝试捕获的话,只有热点在窗体的 可见部分时才会引发鼠标事件消息。如果一个窗体必须接收所有的鼠标事件,即便光标移到了窗口之外,捕获鼠标输入就很 有用了。例如,涌涌程序可能会跟踪按下一个鼠标键后的光标位置,跟着光标移动鼠标,直 到释放鼠标键。如果应用程序没有捕获鼠标输入的话,用户在窗体外释放鼠标键时,该窗体 就不会收到 button-up 消息了。线程中可
5、以使用 GetCapture 函数确定是否有一个它的窗口正在捕获鼠标,如果发现一个 窗口正在捕获的话,GetCapture 函数就会获取该窗口的句柄。鼠标单击锁鼠标单击锁鼠标单击锁(ClickLock)是 Microsoft Windows Millennium Edition (Windows Me)及 Windows XP 中新增的辅助选项,该功能允许用户点击主键后锁定为按下状态,对于应用程 序来说该键看起来是按下去的,应用程序可以通过发送任意的鼠标消息或用户单击任意键来 释放该键。该特点可以使得用户做复杂的鼠标组合时变得简单。如,突出显示、拖拽或者打 开菜单时就会很容易。更多信息,请参阅
6、 SystemParametersInfo 及如下标志的详细描述:SPI_GETMOUSECLICKLOCK SPI_SETMOUSECLICKLOCK SPI_GETMOUSECLICKLOCKTIME SPI_SETMOUSECLICKLOCKTIME鼠标设置鼠标设置尽管鼠标是一个重要的输入设备,但并不是每个用户都需要鼠标。应用程序通过调用 GetSystemMetrics 函数,并传入 SM_MOUSEPRESENT,就会确定系统中是否安装了鼠标。Windows 可以支持三键的鼠标,三键鼠标包含左键、中键及右键,消息及鼠标的常量命 名中依次用 L、M 及 R 标识三个键。单键鼠标的按键被
7、认为是左键。尽管 Windows 支持多 键鼠标,但大多数应用程序还是主要用左键,其他键反而极少使用。从 Windows 98及 Microsoft Windows NT 4.0开始,应用程序也可以支持鼠标滚轮了,鼠 标滚轮可以被按下或者滚动。鼠标滚轮被按下时,担当中键(第三键)的作用,并发送一般 的中键消息。滚轮旋转时,应用程序就会收到滚轮消息。更多信息请参照“鼠标滚轮”节。从 Windows 2000开始,应用程序可以支持应用程序命令键了,这些键被称为 X 键,使 之能更方便地访问 Internet 浏览器、电子邮件及媒体服务。当 X 键按下时,应用程序会收到 一个 WM_APPCOMMA
8、ND 消息。更多信息,请参照 WM_APPCOMMAND 消息的详细说明。应用程序通过向 GetSystemMetrics 传递 SM_CMOUSEBUTTONS 可以确定鼠标的按键 个数。要为用户设置左手习惯,可以通过 SwapMouseButton 函数交换意义上的左右键。通 过传递 SPI_SETMOUSEBUTTONSWAP 给 SystemParametersInfo 函数也可以调换左右键。注 意:鼠标是一个共享资源,调换左右键同样会影响其他的应用程序。XBUTTONs从 Windows 2000开始, Microsoft 可以支持 Microsoft IntelliMouse Ex
9、plorer,就是一个具 有五个键的鼠标。除了通常的左键、中间及右键外,还包括 XBUTTON1及 XBUTTON2两个 键,这两个键在使用 Microsoft Internet Explorer 时可以提供浏览器的前进、后退功能。Windows 管理器通过 WM_XBUTTON*及 WM_NCXBUTTON*消息可以支持 XBUTTON1、XBUTTON2键,这些消息中 WPARAM 消息中的高字(HIWORD)包含的一 个标志说明按下了那个 X 键。由于这些鼠标消息也介于 WM_MOUSEFIRST 与 WM_MOUSELAST 之间,所以应用程序可以通过 GetMessage 或者 Pe
10、ekMessage 筛选所有的 鼠标消息。 Windows 2000/XP: 下面是支持 XBUTTON1、XBUTTON2的消息:WM_APPCOMMANDWM_NCXBUTTONDBLCLK WM_NCXBUTTONDOWN WM_NCXBUTTONUP WM_XBUTTONDBLCLK WM_XBUTTONDOWN WM_XBUTTONUP MOUSEHOOKSTRUCTEX 下列 API 已更新,并可以支持新的鼠标键了:mouse_event ShellProc MSLLHOOKSTRUCT MOUSEINPUT WM_PARENTNOTIFY由于组件程序中的子窗体不能直接执行 XBU
11、TTON1与 XBUTTON2的命令,所以当 X 键单击时,DefWindowProc 会发送一个 WM_APPCOMMAND 消息到一个窗口,同时也会发 送该消息给它的父窗体。类似于鼠标右键的上下文菜单的方式DefWindowProc 发送一个 WM_CONTEXTMENU 到菜单,同时也会发送给它的父亲。另外,如果 DefWindowProc 收 到一个顶级窗口的 WM_APPCOMMAND 消息,它会以代码 HSHELL_APPCOMMAND 调用 shell hook。 Windows 2000/XP: 支持键盘的额外浏览功能键、媒体功能键、应用载入键及电源管理键, 更多信息,请参照“
12、键盘的浏览及其他功能键”。鼠标消息鼠标消息鼠标移动、按下或释放都会产生鼠标消息。系统把鼠标输入事件转换为消息,并投递到 相应的线程消息队列。如果消息投递过快,线程处理不过来的话,系统就会遗弃原来的消息, 而仅处理最近的鼠标消息了。鼠标在窗体内移动、按下或释放时,又或者该窗体捕获鼠标时,当事件产生,窗体就会 收到相应的鼠标消息。鼠标消息可以分为两类:客户区域消息及非客户区域消息。通常,应 用程序仅处理客户区域消息,而忽略非客户区域消息。本节包含以下内容: 客户区域的鼠标消息 非客户区域的鼠标消息 WM_NCHITTEST 消息客户区域的鼠标消息客户区域的鼠标消息在窗体的客户区域内发生鼠标事件时,
13、该窗体就会收到客户区域的鼠标消息。这时,如 果是移动光标的话,系统就会投递 WM_MOUSEMOVE 消息;如果是按下或释放一个鼠标 键时就会投递以下消息之一: 消息消息含义含义 WM_LBUTTONDBLCLK左键双击 WM_LBUTTONDOWN按下左键 WM_LBUTTONUP释放左键 WM_MBUTTONDBLCLK中键双击WM_MBUTTONDOWN按下中键 WM_MBUTTONUP释放中键 WM_RBUTTONDBLCLK右键双击 WM_RBUTTONDOWN按下右键 WM_RBUTTONUP释放右键 WM_XBUTTONDBLCLKWindows 2000/Windows XP:
14、 X 键双击 WM_XBUTTONDOWNWindows 2000/Windows XP: 按下 X 键 WM_XBUTTONUPWindows 2000/Windows XP: 释放 X 键另外,应用程序可以通过调用 TrackMouseEvent 函数以获取系统发送的另外两个消息: WM_MOUSEHOVER、WM_MOUSELEAVE。WM_MOUSEHOVER 消息是鼠标进入客户区 域时产生的,WM_MOUSELEAVE 是光标离开客户区域时产生的。消息参数消息参数客户区域消息的 lParam 参数描述了鼠标热点的位置,低字部分为 x 坐标,高字部分为 y 坐标。坐标系为客户区域内坐标
15、系,客户区域内左上角的坐标为(0,0) 。wParam 参数包含了发生事件时其他键的状态以及 CTRL、SHIFT 键的状态。处理鼠标 消息时,你可以通过检查这些值来确定鼠标键的状态或 CTRL、SHIFT 键的状态,wParam 可以为下列值的组合: 值值含义含义 MK_CONTROL按下 CTRL 键 MK_LBUTTON按下鼠标左键 MK_MBUTTON按下鼠标中键 MK_RBUTTON按下鼠标右键 MK_SHIFT按下 SHIFT 键MK_XBUTTON1Windows 2000/Windows XP: 按下了第一个 X 鼠 标键MK_XBUTTON2Windows 2000/Wind
16、ows XP: 按下了第二个 X 鼠 标键双击消息双击消息如果快速连续单击两次的鼠标的话,系统就会产生双击消息。当用户单击一个按键时, 系统就会以热点为中心在点周围建立一个矩形区域,同时记录单击的时间,当用户第二次单 击同一个键时,系统就会确定热点是否仍在矩形区域内,并且计算自上一次单击的时间,如 果热点仍在矩形区域内,并且流逝的时间没有超过双击定义的超时期限时,系统就产生了一 个双击消息。应用程序可以通过 GetDoubleClickTime 及 SetDoubleClickTime 函数可以获取或设置双 击超时期限。另外,应用程序也可以调用 SystemParametersInfo 函数时传递 SPI_SETDOUBLECLICKTIME 标志来设置双击超时期限,传递 SPI_SETDOUBLECLKWIDTH 与 SPI_SETDOUBLECLKWIDTH 设置检测双击的矩形框的大 小。然而需要注意的是,所有修改将影响其他应用程序。应用程序定义的窗体默认不接收双击消息,因为系统之前已经作了双击消息处理,仅属 于那些具有 CS_DBCLK