鼠标指针渲染器

时间:2013-04-24 00:08:53

标签: c++ windows api winapi

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

1 个答案:

答案 0 :(得分:5)

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

使用这个特殊的光标技巧也是将延迟降至最低的必要条件。如果你编写一个绘制到windows表面的程序(例如使用GDI或甚至通过OpenGL或Direct3D),你会看到它落后于真实光标几毫秒,这对于用户非常容易理解(这就是现代RTS的原因)游戏使用这个硬件光标功能,而不是自己重新实现它。)

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

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

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