如何在WPF中创建一个允许鼠标事件通过的半透明窗口 [英] How to create a semi transparent window in WPF that allows mouse events to pass through

查看:39
本文介绍了如何在WPF中创建一个允许鼠标事件通过的半透明窗口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建类似于 Adob​​e Lightroom 中的 Lights out/lights dim 功能的效果 (http://www.youtube.com/watch?v=87hNd3vaENE),WPF 除外.

I am trying to create an effect similar to the Lights out /lights dim feature in Adobe Lightroom (http://www.youtube.com/watch?v=87hNd3vaENE) except in WPF.

我尝试的是在现有窗口的顶部创建另一个窗口,使其透明并在其上放置一个半透明的路径几何体.但我希望鼠标事件能够通过这个半透明窗口(到下面的窗口).

What I tried was to create another window over-top of my existing window, make it transparent and put a semi transparent Path geometry on it. But I want mouse events to be able to pass through this semi transparent window (on to windows below).

这是我所拥有的简化版本:

This is a simplified version of what I have:

<Window x:Class="LightsOut.MaskWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    AllowsTransparency="True" 
    WindowStyle="None"
    ShowInTaskbar="False"
    Topmost="True" 
    Background="Transparent">

<Grid>

    <Button HorizontalAlignment="Left" Height="20" Width="60">click</Button>

    <Path IsHitTestVisible="False" Stroke="Black" Fill="Black" Opacity="0.3">

        <Path.Data>
            <RectangleGeometry Rect="0,0,1000,1000 "/>
        </Path.Data>
    </Path>             

</Grid>

窗口是完全透明的,所以在路径没有覆盖的地方,鼠标事件直接通过.到现在为止还挺好.路径对象上的 IsHitTestvisible 设置为 false.因此鼠标事件将通过它传递给同一窗体上的其他控件(即您可以单击按钮,因为它在同一窗体上).

The window is fully transparent, so on places where the Path doesn't cover, mouse events pass right through. So far so good. The IsHitTestvisible is set to false on the path object. So mouse events will pass through it to other controls on the same form (ie you can click on the Button, because it is on the same form).

但是鼠标事件不会通过 Path 对象传递到它下面的窗口.

But mouse events wont pass through the Path object onto windows that are below it.

有什么想法吗?或者更好的方法来解决这个问题?

Any ideas? Or better ways to solve this problem?

谢谢.

推荐答案

我遇到了类似的问题并找到了解决方案:

I've had similar problem and found a solution:

public static class WindowsServices
{
  const int WS_EX_TRANSPARENT = 0x00000020;
  const int GWL_EXSTYLE = (-20);

  [DllImport("user32.dll")]
  static extern int GetWindowLong(IntPtr hwnd, int index);

  [DllImport("user32.dll")]
  static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);

  public static void SetWindowExTransparent(IntPtr hwnd)
  {
    var extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
    SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);
  }
}

对于您的窗口集:

WindowStyle = None
Topmost = true
AllowsTransparency = true

在窗口后面的代码中添加:

in code behind for the window add:

protected override void OnSourceInitialized(EventArgs e)
{
  base.OnSourceInitialized(e);
  var hwnd = new WindowInteropHelper(this).Handle;
  WindowsServices.SetWindowExTransparent(hwnd);
}

瞧——点击窗口!请参阅以下原始答案:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a3cb7db6-5014-430f-a5c2-c9746b077d4f

and voila - click-through window! See original answer in: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a3cb7db6-5014-430f-a5c2-c9746b077d4f

这篇关于如何在WPF中创建一个允许鼠标事件通过的半透明窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆