2013-04-24 111 views
0

我正在考虑用C++针对Windows 7(使用Windows api)创建一个允许在同一台PC上使用第二个鼠标指针的软件,所以我的问题是Windows的女巫部分是处理鼠标的渲染指针? 我相信,理解它的实际工作方式将允许我模仿它以呈现第二个鼠标指针。 谢谢。鼠标指针渲染器

回答

4

Windows的窗口系统只支持一个“true”光标:它是2D图形芯片组的低级功能(这就是为什么光标不显示在屏幕截图中)。 Windows将保留光标位图的独立视频内存区域设置为独立区域:具有AND/XOR通道(用于索引的不透明度和颜色反转)的DDB(设备相关位图),或用于透明度为alpha的32bpp RGBA表面游标(这是如何实现“显示光标阴影”功能)。我的理解是,光标被应用于实际的输出图像,因为它由输出设备“扫描”(例如DAC用于VGA输出或任何DVI和HDMI使用),所以它在帧缓冲区中从不存在 - 这就是光标在我们合成窗口管理器之前的几天就工作过了,并且无需让应用程序在光标所在的位置重绘自己。

对于光标使用这个特殊的技巧也是必要的,以保持延迟最小。如果你编写一个绘制到窗口表面的程序(例如使用GDI甚至通过OpenGL或Direct3D),你会发现它比真实光标滞后几毫秒,这对用户来说很容易知道(这就是为什么现代RTS游戏使用这个硬件游标功能而不是自己重新实现)。

我没有办法扩展这个功能,我知道 - 你将不得不成为反汇编之神来修改Windows和图形驱动程序来实现绘制多个游标的能力。

这就是事物的表现方面。对多个游标的实际应用程序级支持也很棘手 - 请记住,光标移动对应于各种与鼠标相关的窗口消息发送给hWnds。两个游标的问题是这些消息会冲突,尽管理论上它应该工作,只要它们被正确地序列化到一个队列中即可。应用程序会出现问题,很多人会假设,例如,只有一个控件可以一次处于Hover状态,如果您有多个游标,那么应用程序只会尊重最新的游标消息。

我可能会建议您看看Windows 7中引入的多点触控支持,它支持多个同时“游标”,虽然它只针对手指而不是鼠标。

+0

谢谢您的评论和建议。我不认为这很复杂。 – sifadil 2013-04-24 00:56:20

+0

顺便说一下,屏幕录制软件实际上能够记录鼠标光标,所以他们只是在视频上放置假的光标形状? – sifadil 2013-04-24 01:08:52

+1

@Dai:应用程序可以通过使用[原始输入](http://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx)API来支持多个鼠标而不用担心碰撞。这是因为你必须注册你感兴趣的特定设备,然后通知消息告诉你哪个设备正在发送通知。 MSDN甚至提到了这种可能性:“即使应用程序来自同一类型的设备,应用程序也可以区分输入源**例如,两个鼠标设备**” – 2013-04-24 01:14:58