【问题标题】:Create a fully transparent WPF window to capture mouse events创建一个完全透明的 WPF 窗口来捕获鼠标事件
【发布时间】:2010-12-11 09:46:12
【问题描述】:

我正在尝试通过使用最顶层的透明非模态窗口来捕获 WPF 中的鼠标事件。我发现如果窗口的不透明度为 0.01 或更大并且它具有背景颜色,则此方法可以正常工作,但是当不透明度设置为 0 时,它不再接收鼠标消息。有没有办法让这个窗口看起来完全透明并且仍然获得鼠标输入?

【问题讨论】:

  • 透明窗口通常会导致问题,我有点好奇你为什么采用这种方法。我知道 3.5 SP1 解决了一些主要问题,但它仍然是捕获鼠标输入的一种相当繁重的方法。我你已经可以接管屏幕了,也许在应用程序窗口本身中这样做会更好?

标签: wpf mouse transparency


【解决方案1】:

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

您根本不需要使用不透明度(即,将其保持为 100% 不透明度)。

【讨论】:

  • 我试过这个,想到了同样的可能性,但它不起作用。当背景透明时,程序不会捕获点击,而是抓取下面的任何程序。
  • 你能举个例子吗?我使用这种方法(通常是#00000000,因为它很容易输入),它似乎对我来说效果很好。
【解决方案2】:

据我所知,没有。

ControlWindow 完全透明时,可以单击它。如果您设置Window.Background="Transparent"Opacity="0",就会出现这种情况。据我所知,这是 WPF 设计的。

当使用 0.01 的不透明度时,您应该几乎看不到窗口,如果有的话。这可能是实现该功能的最佳选择。

编辑:我尝试过并且确实有效的另一种解决方案是将背景颜色设置为几乎透明的颜色。我使用了Background="#01000000",因此将 alpha 值设置为 1。这使您的窗口背景看起来透明,但允许您在窗口完全不透明的情况下在其上放置控件。

【讨论】:

  • 查看我的编辑以获得不同的解决方案。您可以将背景更改为近乎透明的颜色,并且仍然保持窗口完全不透明,以防您想在屏幕上叠加一些控件。
  • 第二种解决方案确实有效,但看起来与将不透明度设置为 0.01 相同。
  • 实际上,即使是完全透明的颜色值也有效——我为此使用了#00000000。它之所以有效,是因为不透明度不是 0,并且画笔是纯色画笔 - 似乎没有考虑 alpha 值。 Brushes.Transparent 也有效,因为它只是一个 #00FFFFFF 纯色画笔
  • @Egor:当我尝试这个时,透明画笔导致窗口被点击。这是在 .NET 3.5 SP1 上...所以可能是不同的版本?
  • @Egor 我必须在 .NET 4.5 中也将背景设置为 #01000000。
【解决方案3】:

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

确保将 IsHitTestVisible 设置为 true。即使不透明度为 100% 并且背景是透明的,也不是所有控件都可以被点击。

【讨论】:

  • 也许我做错了什么,但是当我使用这些设置在窗口上显示时,它根本不会显示(即当你 alt+tab 时窗口不存在)。
【解决方案4】:

在 Visual Studio 2010 中: 在设计视图中选择您的窗口。

将窗口的属性设置为:

  • AllowsTransparency:检查一下
  • 背景:透明
  • 窗口样式:无

【讨论】:

  • @JMK 因为这会使点击通过窗口,除非您在窗口内点击实际控件。
  • 对我来说关键是“AllowsTransparency”
【解决方案5】:

例如,我认为您的控件名称是 MyGrid,而您希望它是 Transparent 并且总是得到 MouseOverEvent.....

如果(窗口AllowsTransparencyTrue并且窗口BackgroundTransparent那么

使用#01777777 这样的颜色来表示MyGrid Background 0.01 MyGridOpacity.

否则

使用类似 #00777777 的东西代表MyGrid Background 0.00 代表@ 987654338@Opacity.

【讨论】:

    【解决方案6】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 2011-11-09
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多