![]() |
1
25
虽然我不能确切地解释为什么会发生这种情况,但我想我可以展示如何绕过它。 iconinfo结构包含两个成员hbmmask和hbmcolor,分别包含光标的掩码和颜色位图(请参见msdn页 ICONINFO 官方文件)。 为默认光标调用getICONINFO()时,ICONINFO结构包含有效的遮罩和颜色位图,如下所示(注意:已添加红色边框以清楚显示图像边界): 默认光标蒙板位图 default cursor mask bitmap image http://img4.imageshack.us/img4/1108/arrowmask.png 默认光标颜色位图 default cursor color bitmap image http://img191.imageshack.us/img191/7680/arrowcolor.png 当Windows绘制默认光标时,首先使用和光栅操作应用遮罩位图,然后使用XOR光栅操作应用颜色位图。这将导致不透明的光标和透明的背景。 但是,当您为i-beam光标调用geticoninfo()时,iconinfo结构只包含有效的遮罩位图,而不包含颜色位图,如下所示(注意:再次添加红色边框以清楚地显示图像边界): 工字梁光标蒙板位图 ibeam cursor mask bitmap image http://img14.imageshack.us/img14/6025/ibeammask.png 根据iconinfo文档,i-beam光标是单色光标。遮罩位图的上半部分是和遮罩,而遮罩位图的下半部分是XOR位图。当Windows绘制工字梁光标时,该位图的上半部分首先通过“和光栅”操作绘制在桌面上。然后,使用XOR光栅操作在顶部绘制位图的下半部分。在屏幕上,光标将显示为其后面内容的倒数。 其中之一 comments 对于您链接的原始文章,提到了这一点。在桌面上,由于光栅操作应用于桌面内容,因此光标将正确显示。但是,当图像不在背景上绘制时(如在已发布的代码中),Windows执行的光栅操作会导致图像褪色。 也就是说,这个更新的capturecursor()方法将处理彩色和单色光标,当光标为单色时提供纯黑色光标图像。
代码有一些问题,可能是或不是问题。
|
![]() |
2
10
|
![]() |
3
3
下面是Dimitar的一个修改版本的响应(使用drawiconex),它在多个屏幕上对我有效:
|
![]() |
4
2
您对半透明的“灰色”i-beam光标的描述让我怀疑您是否遇到了图像缩放或光标位置错误的问题。 在那个网站上发布的一个人提供了一个(断开的)链接,指向一个具有特殊行为的报告,我跟踪到: http://www.efg2.com/Lab/Graphics/CursorOverlay.htm 该页面上的示例不在C中,但代码项目解决方案的作者可能正在做类似的事情,我知道在很多场合使用图形对象时,我自己都搞砸了缩放比例:
|
![]() |
5
2
基于其他答案,我制作了一个没有所有Windows API材料的版本(对于单色部分),因为解决方案不适用于所有单色光标。我通过组合两个遮罩部分从遮罩创建光标。 我的解决方案:
|
![]() |
6
1
这是修补版本,包含此页面上显示的所有错误修复:
此版本适用于:
见工作,这里: https://github.com/NickeManarin/ScreenToGif/blob/master/ScreenToGif/Util/Native.cs#L991 |