【发布时间】:2016-08-05 02:54:05
【问题描述】:
我正在尝试创建一个程序,它获取光标下窗口的句柄,显示有关它的一些数据并在整个窗口顶部绘制一个填充的矩形(具有非常低的 alpha)。我正在使用 C# 和 winforms。
我已经成功了,但问题是我的绘图方法在 BackgroundWorker 的循环中,并且它不断在窗口上制作越来越多的矩形(-> 具有更高 alpha 的矩形),或者当将鼠标移动到另一个旧窗口时一个仍然存在。
我还没有找到一种方法来清除绘制的矩形,因为它只是在屏幕上“存在”并且没有绑定到图形对象或任何东西。
我尝试过使用某些本地方法,例如
[DllImport("User32.dll")]
public static extern Int64 SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
public static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);
[DllImport("user32.dll")]
public static extern bool UpdateWindow(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern bool RedrawWindow(IntPtr hWnd, IntPtr lprcUpdate, IntPtr hrgnUpdate, RedrawWindowFlags flags);
但以上都没有正常工作。其中一些确实有效,但随着消息进入队列,重绘不会立即发生,或者非常缓慢且出现故障(闪烁等)。
所以,问题是,如何“删除”我使用 Graphics.FromHwnd(handleOfWindowUnderCursor) 绘制的矩形?实际上,我认为在其他窗口上绘制它并不重要,因为我之前在尝试摆脱自己表单上的绘图时也遇到了同样的问题(也从未解决过这个问题!)。
或者,关于如何在不使用我现在的方法的情况下完成绘制和删除光标下窗口上的矩形的任何建议?
【问题讨论】:
标签: c# winforms graphics screen handle