2010-05-16 1 views
31

WPF를 제외하고 Adobe Lightroom (http://www.youtube.com/watch?v=87hNd3vaENE)의 Lights out/lights dim 기능과 유사한 효과를 만들려고합니다.WPF에서 마우스 이벤트를 통과시킬 수있는 반투명 창을 만드는 방법

내가 시도한 것은 기존 창 위에 다른 창을 만들어 투명하게 만들고 반투명 경로 도형을 그 위에 배치하는 것이 었습니다. 하지만 마우스 이벤트가이 반투명 창 (아래의 창)을 통과 할 수 있기를 바랍니다.

이 내가 무슨의 단순화 된 버전은 다음과 같습니다 경로가 커버하지 않는 장소에, 마우스 이벤트를 잘 통과 할 수 있도록

<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로 설정됩니다. 따라서 마우스 이벤트는 동일한 양식의 다른 컨트롤로 전달됩니다 (즉, 동일한 양식에 있기 때문에 버튼을 클릭 할 수 있음).

그러나 마우스 이벤트는 경로 개체를 통해 그 아래에있는 창으로 전달되지 않습니다.

아이디어가 있으십니까? 또는이 문제를 해결하는 더 좋은 방법은?

감사합니다.

답변

52

나는 비슷한 문제를 가지고 있었고, 해결책을 발견했습니다 :

뒤에 창 추가 기능을위한 코드
WindowStyle = None 
Topmost = true 
AllowsTransparency = true 

:

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

과 창 세트에 대한

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); 
    } 
} 

을 voila - 클릭 연결 창! 원본 답변보기 : http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a3cb7db6-5014-430f-a5c2-c9746b077d4f

+2

감사합니다. 정확히 내가 찾고 있었던 것이 었습니다. – RMK

+0

이것은 대단합니다. 커서를 숨기는 또 다른 작업을 수행하고 싶습니다. 기본적으로 커서를 없음으로 설정하지만이 COOOOL 코드를 사용하면 창 아래에있는 내용을 기반으로 커서가 변경됩니다. 클릭 수를 창 밖으로 내리고 커서를 볼 수 없게하는 방법이 있습니까? –

+0

완벽하게 작동합니다! WinForms 응용 프로그램의 WPF 창에서 "클릭"방식을 사용할 수있었습니다. – Alex

2

설명 된 내용이 예상되는 동작처럼 들립니다. 한 가지 해결책은 Path를 채우기를 {x : Null}로 설정하는 것입니다.이 방법은 객체를 적중하지 않게하는 유일한 방법입니다.

0

다른 아이디어가 있습니다.

마우스 커서 바로 아래에있는 정확하게 하나의 픽셀을 완전히 투명하게 만든 경우 어떻게해야합니까? :]