Как сделать окно невидимым для событий мыши в WPF? - PullRequest
5 голосов
/ 10 января 2011

Я создал этот класс, и он отлично работает, чтобы сделать мое 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);

Какой код возвращает приложение в нормальное состояние?

Ответы [ 3 ]

7 голосов
/ 10 января 2011

Следующий код в вашем существующем классе получает существующие стили окна (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, который вы добавили из стилей окна. Вы делаете это, выполняя побитовую операцию И НЕ (в отличие отИЛИ операция, которую вы выполнили для добавления флага).Совершенно не нужно помнить ранее извлеченный расширенный стиль, как предполагает ответ deltreme , поскольку все, что вам нужно сделать, это сбросить флаг 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);
}
1 голос
/ 10 января 2011

Вы пытались использовать это вместо этого? (это равняется окну)

this.IsHitTestVisible = false;
1 голос
/ 10 января 2011

Этот код выбирает текущий стиль окна:

int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE); 

Этот код устанавливает флаг WS_EX_TRANSPARENT на extendedStyle:

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

Все, что вам нужно сделать, это запомнитьчто extendedStyle вы получили от GetWindowLong(), и снова наберите SetWindowLong() с этим исходным значением.

...