カーソルの下にあるウィンドウのハンドルを取得し、それに関するいくつかのデータを表示し、ウィンドウ全体の上に(非常に低いアルファで)塗りつぶされた長方形を描画するプログラムを作成しようとしています。C# と winforms を使用しています。
私はそうすることに成功しましたが、問題は私の描画メソッドがBackgroundWorkerのループにあり、ウィンドウ上にますます多くの長方形(->より高いアルファを持つ長方形)を作成し続けるか、マウスを別のウィンドウに移動すると古いウィンドウがまだ存在することです.
描画された四角形は画面上に「ある」だけで、グラフィックスオブジェクトなどにバインドされていないため、描画された四角形をクリアする方法を見つけることができませんでした。
次のような特定のネイティブメソッドを使用してみました
[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) を使用して描画した四角形をどのように「削除」するかということです。自分のフォームでも描画を取り除こうとしたときに以前とまったく同じ問題が発生したため、他のウィンドウに描画されても問題ないと実際に思います(それも修正されたことはありません!)。
または、現在の方法を使用せずに、カーソルの下のウィンドウの長方形を描画および削除する方法についての提案はありますか?