Como criar uma janela semitransparente no WPF que permita que os events do mouse passem

Estou tentando criar um efeito semelhante ao recurso de atenuação Luzes para fora / luzes no Adobe Lightroom ( http://www.youtube.com/watch?v=87hNd3vaENE ), exceto no WPF.

O que eu tentei foi criar outra janela acima da minha janela existente, torná-la transparente e colocar uma geometry de caminho semi-transparente nela. Mas eu quero que os events do mouse possam passar por essa janela semitransparente (para as janelas abaixo).

Esta é uma versão simplificada do que tenho:

         

A janela é totalmente transparente, então em locais onde o Path não cobre, os events do mouse passam direto. Por enquanto, tudo bem. O IsHitTestvisible é definido como false no object do caminho. Assim, os events do mouse passarão para outros controles no mesmo formulário (por exemplo, você pode clicar no botão, porque está no mesmo formulário).

Mas os events do mouse não passarão pelo object Path nas janelas abaixo dele.

Alguma ideia? Ou melhores maneiras de resolver este problema?

Obrigado.

Eu tive problema semelhante e encontrei uma solução:

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

para o seu conjunto de janelas:

 WindowStyle = None Topmost = true AllowsTransparency = true 

no código por trás da janela, adicione:

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

e voila – janela de cliques! Veja a resposta original em: http://social.msdn.microsoft.com/Forums/pt-BR/wpf/thread/a3cb7db6-5014-430f-a5c2-c9746b077d4f

O que você descreveu parece o comportamento esperado. Uma solução é definir o Fill como {x: Null} no caminho, já que é a única maneira segura de fazer um object não atingir o teste.

Eu tenho outra ideia.

E se você fizesse exatamente UM PIXEL, logo abaixo do cursor do mouse, completamente transparente? :]