WPF全透明+不可点击

时间:2014-06-18 11:43:49

标签: c# wpf transparency clickable

好的伙计们,所以我的WPF应用程序有问题。到目前为止,我设法制作了一个透明背景窗口(+无刷)。如果我的窗口是聚焦的话,我也添加了功能。显然,我的窗口永远不应该集中注意力(因为透明度)。这是有效的,但是当我添加时,让我们说矩形(在Canvas上):

                        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,这就是为什么我在这里问这个问题。获胜表格的解决方案如下:WINFORM SOLUTION

现在好了我想要实现的例子: example image

因此红色区域是我的窗口(WPF APP)大小。背景是透明的(显然)。背景应用是记事本。我们可以在Canvas上看到文字和矩形。 现在,如果我点击1.(第一个)箭头,这是btw透明区域,没有任何反应(那很好)。如果我点击2.(第二个)箭头,会出现MessageBox,这意味着我的WPF APP已经聚焦,这就是我不想要的。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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

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