现在的位置: 首页 > 综合 > 正文

Windows中多指针输入技术的实现与应用(4多鼠标输入的底层实现)

2012年03月28日 ⁄ 综合 ⁄ 共 1738字 ⁄ 字号 评论关闭

Windows中多指针输入技术的实现与应用(4多鼠标输入的底层实现)

湖南大学 谢祁衡

2 多鼠标输入的底层实现

2.1 通过开发过滤式鼠标驱动的实现

此技术最先由M.Westergaard[9]中提出,此技术主要思路为从驱动程序层面解决Windows本身不能识别多个指针设备的问题。通过设计单独的一套鼠标驱动程序和 API完成硬件与用户层应用程序的通信。主要的技术可以用图2.1来描述。


注:图左边为过滤式鼠标驱动程序的工作方式,右边为通常程序的运行方式,它们可以共存。

2.1 过滤式鼠标驱动实现原理图[9]

 

此驱动程序是通过过滤鼠标的输入,所有的鼠标输入信息都在通过此驱动程序的时候加入 ID信息,使得系统辨识不同鼠标,就像从各种不同的独立的驱动程序中接收数据一样。低层API主管在各驱动程序之间的通信和处理上一个层面的反馈。高层的API允许用户层的应用程序在一个有效的途径上接受鼠标的输入。

这个技术解决了支持多鼠标输入的原理问题,最主要的优点是开发人员拥有对鼠标输入最完全的控制,也可以进行最彻底的优化,不受他人开发程序效率的限制。并且当低层系统有改变,比如当Windows决定从低层开始支持多鼠标输入的时候,上层的软件可以几乎不改变就正常使用。但是缺点也很明显,进行核心编程和驱动程序的开发都

太过于复杂且难以控制。另外,虽然对于鼠标有着较为通用的驱动程序,但是对于不同的指针设备还必须提供不同的驱动程序,所以对于新的指针设备的识别也将会成为难点,使得此技术仅仅只能被框架级程序的专业开发所利用,比如Octopus frameworkCPNmouse[9]而且仅仅对于鼠标等有限的设备有着很好的支持。

 

2.2用户层利用RawInput的实现

       微软在Windows XP中在RawInput API中加入了鼠标的ID信息数据,因此,使得在Windows XP中通过直接分辨RawInput API中的鼠标ID信息非常方便地来识别不同的鼠标输入。

       虽然能够识别不同数据,但是对于不同鼠标指针的绘制完全要由编程人员控制。此技术有着对鼠标输入比较完全的控制,识别不同鼠标输入的数据较为容易,且仅仅通过微软的底层程序,因此效率很高。而且对于新加入的指针设备能有较快的反应,可以不考虑驱动程序就对新的指针设备提供直接支持。值得一提的是,微软对于RawInput提供了文档支持,且网上实现此技术的相关资料较为丰富,这点对于开发工作来说,必不可少。缺点是用户层上的开发工作并不是很容易,特别是很好的多鼠标输入数据处理方式和多鼠标指针的绘制技术比较难以掌握,而利用较为容易实现的时分方式会带来一些副作用,比如当多个虚拟指针同时拖动窗口的时候,将导致未定义的行为。[5] 而且,此技术只能在Windows 2000/XP中运用,Windows 9x 下已确认无法使用。但是因为此方法的优点明显,缺点却难以用其他方法弥补,使得很多各层次的程序都是利用此技术完成,比如SDG ToolkitMAME:Analog+,以及Reflexive Entertainment, Inc的大部分符合Mouse-Party的游戏。

 

2.3 RawInput实现的原理

         在此节,分各鼠标输入数据的识别和各鼠标独立指针的绘制两方面详细介绍了RawInput实现的原理。

2.3.1 RawInput各鼠标输入数据的识别原理

       虽然Windows并不直接支持多指针输入设备,但是通过原始的输入数据识别还是可以分辨不同的鼠标输入,在Windows XP中提供原始输入数据处理的方法是通过注册使用RawInput设备以获得RAWINPUT结构类型数据的方式。具体流程图如下:


开始



GetRawInputDeviceList



数获取


RawInput


设备数量



RegisterRawInputDevices


函数注册


RawInput


设备


调用


GetRawInputData


函数


获得


pData


大小


调用


GetRawInputData


函数


获得


RAWINPUT


数据


header.dwType


==


RIM_TYPEMOUSE


保存


RawInput


中的


data.mouse


数据


检查


data.mouse



据中的坐标边界


重新以新坐标


定位鼠标指针

抱歉!评论已关闭.