Как передать события с окна в WPF на первое окно, находящееся под ним?

151
28 января 2020, 13:00

Нужно создать окно для эффекта водяного знака на экране. Вывести его поверх других окон и задать прозрачность получилось, но все события клика мышки уходят в него. Как добиться полной прозрачности окна для системы?

Answer 1

Используйте IntPtr для вашего окна. Например, создайте статический класс для DllImport:

public static class DllImporter
{
    const int WS_TRANSPARENT = 0x00000020;
    const int GWL_STYLE = (-20);
    [DllImport("user32.dll")]
    static extern int GetWindowLong(IntPtr hwnd, int index);
    [DllImport("user32.dll")]
    static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);
    public static void SetWindowTransparent(IntPtr hwnd)
    {
        var style = GetWindowLong(hwnd, GWL_STYLE);
        SetWindowLong(hwnd, GWL_STYLE, extendedStyle | WS_TRANSPARENT);
    }
}

И в code-behind вашего прозрачного окна перепишите событие OnSourceInitialized:

protected override void OnSourceInitialized(EventArgs e)
{
    base.OnSourceInitialized(e);
    var hwnd = new WindowInteropHelper(this).Handle;
    DllImporter.SetWindowTransparent(hwnd);
}

После этого ваше окно не будет перехватывать события.

UPD:

Для вашего окна необходимы атрибуты в XAML: WindowStyle="None" Topmost="True" AllowsTransparency="True"

Для проверки - полупрозрачное окно с

<Window.Background>
        <SolidColorBrush Opacity="0.5" Color="Red"/>
</Window.Background>

READ ALSO
Как получить текущий сертификат

Как получить текущий сертификат

Настроил IIS на аутентификацию по смарт-карте по данной статье https://blogjayway

176
Перемешать значения в массиве

Перемешать значения в массиве

Нужно, чтобы значения из массива всегда выводились в случайном порядкеПробовал array_rand, но эта функция перемешивает только ключи массива

145
PHP не выполняется system

PHP не выполняется system

ubuntu 18, php72 требуется выполнить Program

155