Прозрачная, прокликиваемая “внутрь” форма

247
19 июля 2017, 21:13

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

Answer 1

Вам надо просто установить специальные атрибуты окна, по такому же принципу многие разработчики делают ScreenSaver'ы. SetWindowLong/GetWindowLong с установкой бита WS_EX_TRANSPARENT в стиле окна, что делает наше окно "прокликиваемым".

Задаем нашему окну AllowsTransparency="True", стиль WindowStyle="None" и делаем его поыерх всех Topmost="True".

AllowsTransparency существует для упрощения создания непрямоугольных окон и, следовательно, если AllowsTransparency имеет значение true, окна WindowStyle свойство должно быть присвоено None.

MainWindow.xaml.cs

using System;
using System.Windows;
using System.Windows.Interop;

namespace UnClickable
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            var hwnd = new WindowInteropHelper(this).Handle;
            WindowProperties.SetWindowExTransparent(hwnd);
        }
    }
}

WindowProperties.cs

using System;
using System.Runtime.InteropServices;
namespace UnClickable
{
    public static class WindowProperties
    {
        const int WS_EX_TRANSPARENT = 0x00000020;
        const int GWL_EXSTYLE = (-20);
        // This static method is required because Win32 does not support
        // SetWindowLongPtr directly
        public static IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
        {
            if (IntPtr.Size == 8)
                return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
            else
                return new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
        }
        // This static method is required because Win32 does not support
        // GetWindowLongPtr directly
        public static IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex)
        {
            if (IntPtr.Size == 8)
                return GetWindowLongPtr64(hWnd, nIndex);
            else
                return GetWindowLongPtr32(hWnd, nIndex);
        }
        [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
        private static extern int SetWindowLong32(IntPtr hWnd, int index, int newStyle);
        [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
        private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int index, IntPtr newStyle);
        [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
        private static extern IntPtr GetWindowLongPtr32(IntPtr hWnd, int nIndex);
        [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
        private static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex);
        public static void SetWindowExTransparent(IntPtr hwnd)
        {
            var extendedStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE);
            SetWindowLongPtr(hwnd, GWL_EXSTYLE, new IntPtr(extendedStyle.ToInt32() | WS_EX_TRANSPARENT));
        }
    }
}

MainWindow.xaml

<Window x:Class="UnClickable.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:UnClickable"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        WindowStyle="None"
        AllowsTransparency="True"
        Topmost="True">
    <Grid>
    </Grid>
</Window>
READ ALSO
Автоматическое обновление DataGrid

Автоматическое обновление DataGrid

Есть коллекция категорий с продуктами

192
Как сделать, чтобы на странице мог находиться только 1 юзер?

Как сделать, чтобы на странице мог находиться только 1 юзер?

Например, есть некоторая страница, с которой можно управлять данными, и нужно, чтобы туда нельзя попасть, если кто то уже там находитсяНавскидку...

185