鼠标指针渲染器

Mouse pointer renderer

本文关键字:鼠标指针      更新时间:2023-10-16

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

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

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

据我所知,没有办法扩展这个功能——你必须是一个拆卸之神,才能修改Windows和图形驱动程序来实现绘制多个光标的能力。

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

我可能会建议看看Windows的多点触摸支持,在Windows 7中引入,它确实支持多个同时的"光标",尽管它是针对手指的,而不是鼠标。