我正在尝试创建一个程序,用于获取鼠标下窗口的句柄,并显示一些有关它的数据,并在整个窗口上绘制一个填充矩形(非常低的alpha)。我正在使用C#和winforms。
我已经成功地完成了这个程序,但问题是我的绘制方法在BackgroundWorker的循环中,它会在窗口上制作出越来越多的矩形(->带有更高alpha值的矩形),或者当移动鼠标到另一个窗口时,旧的矩形仍然存在。
我还没有找到清除绘制的矩形的方法,因为它只是“存在”于屏幕上,没有绑定到图形对象或其他任何东西。
我已经尝试使用某些本地方法,比如:
但以上方法都没有正常工作。其中一些可以工作,但当消息进入队列时,重绘不会立即发生或非常缓慢和出现故障(闪烁等)。
我已经成功地完成了这个程序,但问题是我的绘制方法在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)“删除”我绘制的矩形?实际上,我认为它在其他窗口上绘制并不重要,因为我以前在尝试消除自己表单上的图纸时也遇到了同样的问题(也从未解决!)。
或者,是否有任何建议,可以在不使用我现在正在使用的方法的情况下在光标下的窗口上绘制和删除矩形?