我们需要使用自定义形状覆盖目标窗口并跟踪目标窗口的位置,以使覆盖图始终显示在其上方。此外,叠加图应显示在使用BitBlt
或PrintClient
通过屏幕捕获工具(如Camtasia,Debut等)拍摄的屏幕截图中。此外,移动目标窗口周围不应留下绘图的痕迹地点。目标窗口不是使用我们的代码制作的。
到目前为止,我们尝试了几种方法,但每种方法都存在问题:
1)分层窗口:
使用分层窗口作为目标窗口的子窗口/拥有窗口是最简单的事情并且它可以工作。但问题出在 Windows 7 和 XP 上,如果没有BitBlt
标志和屏幕截图,分层窗口不会显示在CAPTUREBLT
中工具可以在没有标志的情况下调用BitBlt
,从而从捕获中跳过我们的窗口。
2)区域窗口:
支持所有Windows版本的粗略方法是使用SetWindowRgn
的区域窗口,并使目标窗口成为其所有者。然而,区域窗口在渲染复杂形状时通常非常慢,并且还影响其他窗口的性能,有时甚至会冻结应用程序。拖动应用程序窗口时,区域窗口也会留下痕迹。
3)对HDC进行子类化和绘图:
另一种方法是对目标窗口进行子类化,并在窗口过程钩子内的OnPaint()
事件上在其HDC上绘制形状。也可以在桌面窗口上绘制形状。问题是应用程序可能在没有绘制事件的情况下绘制,例如使用光标选择某些文本时,此类绘图可能会删除自定义绘图的一部分。跟踪所有可能的油漆事件并不是一个很好的方法。
4)在计时器中持续绘图:
最后的方法是在定时器中连续在目标窗口上绘制自定义形状,以便绘图始终高于目标,即使在文本选择上也是如此。但是,当选择文本时,这可能会显示一些闪烁。更不用说,不断吸引人的表现很重要。
问题
实现覆盖绘图的最佳方法是什么,该绘图适用于所有Windows版本(自XP以来)同时出现在屏幕截图中。我们已经用尽所有方法。我有什么方法可以丢失吗?可以使用上述方法进行一些改进吗? DirectX是一种选择吗?我正在寻找具有快速渲染能力的方法来实现这一目标。感谢任何帮助!
答案 0 :(得分:0)
我认为绘制叠加窗口的最佳解决方案是使用双缓冲技术GDI,就像在这个例子中一样: Overlay Drawing in CScrollView
我自己也有同样的任务,唯一的解决方案就是那个。希望对你有所帮助。