4

カーソルの下にあるウィンドウのハンドルを取得し、それに関するいくつかのデータを表示し、ウィンドウ全体の上に(非常に低いアルファで)塗りつぶされた長方形を描画するプログラムを作成しようとしています。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) を使用して描画した四角形をどのように「削除」するかということです。自分のフォームでも描画を取り除こうとしたときに以前とまったく同じ問題が発生したため、他のウィンドウに描画されても問題ないと実際に思います(それも修正されたことはありません!)。

または、現在の方法を使用せずに、カーソルの下のウィンドウの長方形を描画および削除する方法についての提案はありますか?

4

2 に答える 2

3

を使って描いていることに気づきました

Graphics g = Graphics.FromHwnd(form.Handle);

そのコントロールの下で、フォームの背景に描画します。それはあなたが達成したいことですか?

// draw the rectangle
Brush b = new SolidBrush(Color.FromArgb(20, 0, 0, 255));
g.FillRectangle(b, new Rectangle(5, 5, 200, 200));

// clear the rectangle
g.Clear(this.BackColor);

画面に直接描画すると、次のようになります。

Graphics g = Graphics.FromHwnd(IntPtr.Zero);

Windows が画面を更新すると、四角形はすぐに消えます。

3 番目のオプションがありますが、これはあまり簡単ではありません。

四角形を描画する代わりに、不透明度を下げ、TopMost プロパティを true に設定し、境界線のないフォームを作成します。次に、イベントに対して透過的にします。

protected override void WndProc(ref Message m)
        {
            const int WM_NCHITTEST = 0x0084;
            const int HTTRANSPARENT = (-1);

            if (m.Msg == WM_NCHITTEST)
            {
                m.Result = (IntPtr)HTTRANSPARENT;
            }
            else
            {
                base.WndProc(ref m);
            }
        }

その後に注意する必要があるのは、このフォームの Visible、Location、および Size プロパティだけです。

于 2013-03-28T14:54:39.373 に答える