Как сделать форму прокликиваемой? На форме label с фоновым изображением, нужно чтобы при клике на форму и label, клик уходил в окно за ней...
Вам надо просто установить специальные атрибуты окна, по такому же принципу многие разработчики делают 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>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Например, есть некоторая страница, с которой можно управлять данными, и нужно, чтобы туда нельзя попасть, если кто то уже там находитсяНавскидку...