WPFでマウスイベントに対してウィンドウを非表示にするにはどうすればよいですか?

c# events mouseevent wpf
WPFでマウスイベントに対してウィンドウを非表示にするにはどうすればよいですか?

このクラスを作成しましたが、WPFアプリケーションをマウスイベントに対して透過的にするのに最適です。

using System.Runtime.InteropServices;

class Win32

{
    public const int WS_EX_TRANSPARENT = 0x00000020;
    public const int GWL_EXSTYLE = (-20);

    [DllImport("user32.dll")]
    public static extern int GetWindowLong(IntPtr hwnd, int index);

    [DllImport("user32.dll")]
    public static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);

    public static void makeTransparent(IntPtr hwnd)
    {
        // Change the extended window style to include WS_EX_TRANSPARENT
        int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
        Win32.SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);
    }

    public static void makeNormal(IntPtr hwnd)
    {
      //how back to normal what is the code ?

    }

}

これを実行して、アプリケーションがマウスイベントを無視するようにしますが、コードを実行した後、アプリケーションを通常の状態に戻し、マウスイベントを再度処理します。 どうすればそれができますか?

IntPtr hwnd = new WindowInteropHelper(this).Handle;
Win32.makeTransparent(hwnd);

アプリケーションを通常に戻すコードは何ですか?

  5  1


ベストアンサー

既存のクラスの次のコードは、既存のウィンドウスタイル( GetWindowLong)を取得し、` WS_EX_TRANSPARENT`スタイルフラグをそれらの既存のウィンドウスタイルに追加します。

// Change the extended window style to include WS_EX_TRANSPARENT
int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
Win32.SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);

*通常の動作に戻す場合は、ウィンドウスタイルから追加した「WS_EX_TRANSPARENT」フラグを_remove_する必要があります。*これを行うには、ビット単位のAND NOT演算を実行します(OR演算とは対照的です) _add_フラグに)。 https://stackoverflow.com/questions/4647345/how-can-i-make-a-window-invisible-to-mouse-events-in-wpfで示唆されているように、以前に取得した拡張スタイルを_remember_する必要はまったくありません/ 4647377#4647377 [deltreme’s answer]、やりたいのは `WS_EX_TRANSPARENT`フラグをクリアするだけだからです。

コードは次のようになります。

public static void makeNormal(IntPtr hwnd)
{
    //Remove the WS_EX_TRANSPARENT flag from the extended window style
    int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
    Win32.SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle & ~WS_EX_TRANSPARENT);
}

7


次のコードは、現在のウィンドウスタイルを取得します。

int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);

このコードは、 extendedStyle`に WS_EX_TRANSPARENT`フラグを設定します。

Win32.SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);

必要なことは、 GetWindowLong()`から取得した `extendedStyle`を覚えて、その元の値で SetWindowLong() `を再度呼び出すことです。

1


代わりにこれを使用してみましたか? (これはウィンドウに等しい)

this.IsHitTestVisible = false;

1


タイトルとURLをコピーしました