WPF 全透明 + 不可点击

Posted

技术标签:

【中文标题】WPF 全透明 + 不可点击【英文标题】:WPF full transparent + non clickable 【发布时间】:2014-08-08 16:43:24 【问题描述】:

好的,我的 WPF 应用程序有问题。到目前为止,我设法制作了一个具有透明背景的窗口(+ 无刷)。如果我的窗口聚焦,我还添加了功能。所以很明显我的窗口不应该被聚焦(因为透明度)。这是可行的,但是当我添加让我们说矩形(在画布上)时:

                        Rectangle testRectangleForText = new Rectangle();
                        testRectangleForText.Stroke = Brushes.Black;
                        testRectangleForText.StrokeThickness = 5;
                        testRectangleForText.Fill = null;
                        testRectangleForText.Height = 300;
                        testRectangleForText.Width = 300;
                        Canvas.SetLeft(testRectangleForText, 0);
                        Canvas.SetTop(testRectangleForText, 20);

                        myCanvas.Children.Add(testRectangleForText);

矩形是可点击的,如果我点击它,我的应用程序将获得焦点(applicationFocus 函数显示 messageBox),我不希望这样。我已经找到了 Win 表单的解决方案,但不是 WPF,这就是我在这里问这个的原因。 win表格的解决方案在这里:WINFORM SOLUTION

好的,现在举个例子,我想要实现的目标: example image

所以红色区域是我的窗口(WPF APP)大小。背景是透明的(显然)。后台应用程序是记事本。我们可以在 Canvas 上看到文本和矩形。 现在,如果我单击 1.(first) 箭头,这是顺便说一句透明区域,什么也没有发生(这很好)。如果我点击 2.(second) 箭头,会出现 MessageBox,这意味着我的 WPF APP 已获得焦点,这就是我不想要的。

【问题讨论】:

尝试将矩形的Fill 属性设置为x:Null,即为空画笔。空画笔与透明画笔不同,不会对鼠标点击做出反应。 什么是 testRectangleForText.Fill = null; ?无论如何,矩形仍然是可点击的(因为“中风”),中风是黑色的。它必须是,所以我可以看到矩形:)。 【参考方案1】:

这对我有用:

从这里:https://social.msdn.microsoft.com/Forums/vstudio/en-US/41ca3605-247c-4c5b-ac5d-74ce5abd7b92/making-a-window-invisible-to-mouse-events-ishittestvisiblefalse-not-working?forum=wpf

我已经想出了如何做到这一点。关键是窗口扩展样式的 WS_EX_TRANSPARENT 标志。您可以像往常一样设置最顶层的属性,然后此代码负责使窗口对鼠标单击透明:

代码片段

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);

protected override void OnSourceInitialized(EventArgs e)

base.OnSourceInitialized(e);

// Get this window's handle
IntPtr hwnd = new WindowInteropHelper(this).Handle;

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

【讨论】:

【参考方案2】:

尝试在您的 XAML 代码中设置 Focusable 属性:

<Window ... Focusable="False">
    < ... />
</Window>

【讨论】:

对我不起作用.. 好吧,我猜问题出在其他地方。我在 this.Dispatcher.Invoke((Action)(() => .... )) 中添加原语从另一个线程。但我没有看到线程和 Canvas(或原语)属性之间的联系。提前 Ty。

以上是关于WPF 全透明 + 不可点击的主要内容,如果未能解决你的问题,请参考以下文章

WPF 制作支持点击穿透的高性能的透明背景异形窗口

如何制作.svg透明区域不可点击

使WPF窗口的一部分点击,而不是它的控件

如何创建一个不规则形状的图像按钮,其中图像的透明部分不可点击?

pushbutton成为可点击的图标(实现全透明,不论点击与否都只显示Icon)(也就是一个万能控件)

WPF DataGrid点击列头选择全列并具有背景色