好的伙计们,所以我的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已经聚焦,这就是我不想要的。
答案 0 :(得分:1)
这对我有用:
我已经弄清楚如何做到这一点。关键是窗口扩展样式的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>