创建一个完全透明的WPF窗口以捕获鼠标事件。

14

我正在尝试使用一个顶部,透明的非模态窗口在WPF中捕获鼠标事件。如果窗口的不透明度为0.01或更高,并且具有背景颜色,则这样做是有效的,但当不透明度设置为0时,它将不再接收鼠标消息。是否有一种方法使此窗口看起来完全透明并仍然获得鼠标输入?


透明窗口通常会引起问题,我有点好奇你为什么选择这种方法。我知道3.5 SP1解决了一些主要问题,但仍然是一种相当重型的捕获鼠标输入的方式。如果你已经可以接管屏幕,也许在应用程序窗口内部执行会更好? - Egor
6个回答

35
据我所知,不行。
当一个控件或窗口被完全透明化后,就可以透过它进行点击。如果您将您的`Window.Background="Transparent"`或`Opacity="0"`,那么这种情况就会出现。据我所知,这是WPF中的设计。
当使用0.01的不透明度时,您几乎看不到窗口,这很可能是您实现该功能的最佳选择。
另一种解决方案是将背景颜色设置为几乎透明的颜色。我使用了`Background="#01000000"`,这样就可以给出一个alpha值为1。这使得您的窗口背景看起来是透明的,但允许您在完全不透明的情况下放置控件。

看我的编辑,有一个不同的解决方案。你可以将背景改为近乎透明的颜色,仍然保持窗口完全不透明,以防你想在屏幕上叠加一些控件。 - Will Eddins
9
实际上,即使是完全透明的颜色值也可以使用-我为此目的使用#00000000。这可行是因为不透明度不为0,而且画刷是一个实心画刷-阿尔法值似乎并未被考虑。 Brushes.Transparent 也能工作,因为它只是一个 #00FFFFFF 的实心画刷。 - Egor
2
@Egor:当我尝试这个的时候,透明画笔导致窗口无法点击。这是在.NET 3.5 SP1上发生的...所以可能是不同的版本? - Will Eddins
1
@Egor 我在 .NET 4.5 中也不得不将背景设置为 #01000000。 - ghord
@Egor 我认为你没有理解原问题的重点,一个值为 #00000000 的窗口将始终使点击穿过窗口,除非你点击实际控件。 - prettyvoid
显示剩余2条评论

12
在Visual Studio 2010 中: 选择你的设计视图中的窗口。 将你的窗口属性设置为:
  • AllowsTransparency:选中
  • Background:透明
  • WindowStyle:无
请注意,html标签已被保留。

1
@JMK 因为这会使得点击事件穿透窗口,除非你点击窗口内的实际控件。 - prettyvoid
对我来说关键是“AllowsTransparency”。 - ariel

3

只需将Background设置为Brushes.Transparent,而不是Background=null。

您无需使用不透明度(即将其保持在100%不透明度)。


4
我尝试了这个方法,考虑到同样的可能性,但是它不起作用。当背景透明时,程序无法捕获点击事件,反而会截取底下的任何程序。 - Will Eddins
你能展示一个例子吗?我通常使用这种方法(一般是 #00000000,因为它很容易输入),对我来说似乎完全有效。 - Egor

1
例如,我认为您的控件名称是MyGrid,您希望它是Transparent并始终获取MouseOverEvent .....

如果(窗口AllowsTransparencyTrue 窗口BackgroundTransparent那么

使用# 01777777 这样的颜色用于MyGrid Background 或者 0.01用于MyGrid Opacity

否则

使用# 00777777 这样的东西用于MyGrid Background 或者 0.00用于MyGrid Opacity


0

你可能会发现使用 Mouse.Capture 更简单。

https://msdn.microsoft.com/en-us/library/ms771301.aspx

当一个对象捕获了鼠标,所有与鼠标相关的事件都被视为该具有鼠标捕获的对象执行该事件,即使鼠标指针位于另一个对象上方。

0

将不透明度设置为100%(或任何非零值),并将背景设置为透明(而不是 null)应使大多数控件可点击。

确保将 IsHitTestVisible 设置为 true。即使不透明度为100%且背景为透明,也无法点击所有控件。


也许我做错了什么,但是当我使用这些设置在窗口上进行Show操作时,它根本没有显示出来(即当你按alt+tab键时,该窗口不会出现)。 - James Cadd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接