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

键盘的内部有一块微处理器,它控制着键盘的全部工作,比如主机加电时键盘的自检、扫描,扫描码的缓冲以及与主机的通讯等等。当一个键被按下时,微处理器便根据其位置,将字符信号转换成二进制码,传给主机和显示器。如果操作人员的输入速度很快或CPU正在进行其它的工作,就先将键入的内容送往内存中的键盘缓冲区,等CPU空闲时再从缓冲区中取出暂存的指令分析并执行。

按照按键方式的不同键盘可分为接触式和无触点式两类。

接触式键盘就是我们通常所说的机械式键盘,它又分为普通触点式和干簧式。普通触点式的两个触点直接接触,从而使电路闭合,产生信号;而干簧式键盘则是在触点间加装磁铁,当键按下时,依靠磁力使触点接触,电路闭合。与普通触点式键盘相比,干簧式键盘具有响应速度快、使用寿命长、触点不易氧化等优点。无触点式键盘又分为电容式、霍尔式和触摸式三种。其中电容式是我们最常用到的键盘类型,它的触点之间并非直接接触,而是当按键按下时,在触点之间形成两个串联的平板电容,从而使脉冲信号通过,其效果与接触式是等同的。电容式键盘击键时无噪声,响应速度快,但是价格很高一些。

按照代码转换方式键盘可以分为编码式和非编码式两种。

编码式键盘是通过数字电路直接产生对应于按键的ASCII码,这种方式目前很少使用。非编码式键盘将按键排列成矩阵的形式,由硬件或软件随时对矩阵扫描,一旦某一键被按下,该键的行列信息即被转换为位置码并送入主机,再由键盘驱动程序查表,从而得到按键的ASCII码,最后送入内存中的键盘缓冲区供主机分析执行。非编码式键盘由于其结构简单、按键重定义方便而成为目前最常采用的键盘类型。由此多姿多彩的多媒体键盘便应运而生,这些键盘通常出现在品牌机上,如联想、同方、海尔、海信等,品牌机的“单键上网”也是基于此原理。另外像Acer、爱国者一些厂商也单独生产许多型号的多媒体键盘。

关于键盘的学问还有很多,不过对于绝大多数电脑爱好者来说,掌握以上这些关于键盘的知识就足够了,这对于我们更好地选购、使用、修理和维护键盘是非常必要的。


鼠标的原理
鼠标是一种将人手的动作记录下来,通过电脑处理后再一点不漏地还原在显示器上并对电脑进行担任的设备。
以常见的半光电结构的鼠标来说,当鼠标向左移动时,鼠标内部滚球受标挚垫的摩擦力而向右侧滚动,带动垂直方向的转轴向左旋转,而转轴未端的圆盘光栅切割其侧面的红外线发光管的光线。圆盘光栅另一侧的红外线接收管内沿上下方向排列了两个接收管,当上面的接收管先于下面感受到红外线后,控制芯片产生向左(或向右)移动的信号,而当下面的接收管先于上面的感受到红外线后,则产生向右(或向左)移动的信号。控制芯片再将这些方向信号调制后送到计算机,在屏幕上正确还原出鼠标的移动,另外一组的水平转动装置同样进行判断,处理情况与水平方向完全相同。而当鼠标作斜方向移动时,水平和垂直两个方向的转动装置同时输出信号,这样,屏幕上的鼠标箭头就可以随着手的移动满屏移动了。当按到鼠标的左、右键时,微动开关的闭合将通断信号传给控制芯片,再转换为电脑可以识别的信号,鼠标的基本原理大致如此。
光电鼠标的工作原理
光电鼠标与机械式鼠标最大的不同之处在于其定位方式不同。
光电鼠标的工作原理是:在光电鼠标内部有一个发光二极管,通过该发光二极管发出的光线,照亮光电鼠标底部表面(这就是为什么鼠标底部总会发光的原因)。然后将光电鼠标底部表面反射回的一部分光线,经过一组光学透镜,传输到一个光感应器件(微成像器)内成像。这样,当光电鼠标移动时,其移动轨迹便会被记录为一组高速拍摄的连贯图像。最后利用光电鼠标内部的一块专用图像分析芯片(DSP,即数字微处理器)对移动轨迹上摄取的一系列图像进行分析处理,通过对这些图像上特征点位置的变化进行分析,来判断鼠标的移动方向和移动距离,从而完成光标的定位。
鼠标右键不能用光电鼠标通常由以下部分组成:光学感应器、光学透镜、发光二极管、接口微处理器、轻触式按键、滚轮、连线、PS/2或USB接口、外壳等。下面分别进行介绍:
光学感应器
光学感应器是光电鼠标的核心,目前能够生产光学感应器的厂家只有安捷伦、微软和罗技三家公司。其中,安捷伦公司的光学感应器使用十分广泛,除了微软的全部和罗技的部分光电鼠标之外,其他的光电鼠标基本上都采用了安捷伦公司的光学感应器。
光电鼠标的控制芯片
控制芯片负责协调光电鼠标中各元器件的工作,并与外部电路进行沟通(桥接)及各种信号的传送和收取。我们可以将其理解成是光电鼠标中的“管家婆”。
这里有一个非常重要的概念大家应该知道,就是dpi对鼠标定位的影响。dpi是它用来衡量鼠标每移动一英寸所能检测出的点数,dpi越小,用来定位的点数就越少,定位精度就低;dpi越大,用来定位点数就多,定位精度就高。
通常情况下,传统机械式鼠标的扫描精度都在200dpi以下,而光电鼠标则能达到400甚至800dpi,这就是为什么光电鼠标在定位精度上能够轻松超过机械式鼠标的主要原因。
光学透镜组件
光学透镜组件被放在光电鼠标的底部位置,从图5中可以清楚地看到,光学透镜组件由一个棱光镜和一个圆形透镜组成。其中,棱光镜负责将发光二极管发出的光线传送至鼠标的底部,并予以照亮。
圆形透镜则相当于一台摄像机的镜头,这个镜头负责将已经被照亮的鼠标底部图像传送至光学感应器底部的小孔中。通过观看光电鼠标的背面外壳,我们可以看出圆形透镜很像一个摄像头通过试验,笔者得出结论:不管是阻断棱光镜还是圆形透镜的光路,均会立即导致光电鼠标“失明”。其结果就是光电鼠标无法进行定位,由此可见光学透镜组件的重要性。
发光二极管
光学感应器要对缺少光线的鼠标底部进行连续的“摄像”,自然少不了“摄影灯”的支援。否则,从鼠标底部摄到的图像将是一片黑暗,黑暗的图像无法进行比较,当然更无法进行光学定位了。
通常,光电鼠标采用的发光二极管(如图7)是红的(也有部分是蓝的),且是高亮的(为了获得足够的光照度)。发光二极管发出的红光线,一部分通过鼠标底部的光学透镜(即其中的棱镜)来照亮鼠标底部;另一部分则直接传到了光学感应器的正面。用一句话概括来说,发光二极管的作用就是产生光电鼠标工作时所需要的光源。
轻触式按键
没有按键的鼠标是不敢想象的,因而再普通的光电鼠标上至少也会有两个轻触式按键。方正光电鼠标的PCB上共焊有三个轻触式按键(图8)。除了左键、右键之外,中键被赋给了翻页滚轮。高级的鼠标通常带有X、Y两个翻页滚轮,而大多数光电鼠标还是像这个方正光电鼠标一样,仅带了一个翻页滚轮。翻页滚轮上、下滚动时,会使正在观看的“文档”或“网页”上下滚动。而当滚轮按下时,则会使PCB上的“中键”产生作用。注意:“中键”产生的动作,可由用户根据自己的需要进行定义。
当我们卸下翻页滚轮之后,可以看到滚轮位置上,“藏”有一对光电“发射/接收”装置。“滚轮”上带有栅格,由于栅格能够间隔的“阻断”这对光电“发射/接收”装置的光路,这样便能产生翻页脉冲信号,此脉冲信号经过控制芯片传送给Windows操作系统,便可以产生翻页动作了。
来源于:hi.baidu/klady/blog/category/%BC%C6%CB%E3%BB%FA%D3%B2%BC%FE