Как создать полу прозрачное окно в WPF, который позволяет событиям от нажатия мыши проходить

Я пытаюсь создать эффект, подобный Световым сигналам / световые сигналы тусклая функция в Adobe Lightroom (http://www.youtube.com/watch?v=87hNd3vaENE) кроме WPF.

То, что я попробовал, должно было создать другое окно, выше моего существующего окна, делают это прозрачным и помещают полу геометрию прозрачного тракта на него. Но я хочу, чтобы события от нажатия мыши смогли пройти через это полу прозрачное окно (на окнах ниже).

Это - упрощенная версия того, что я имею:





    

    

        
            
        
                 


Окно полностью прозрачно, таким образом, на местах, где Путь не покрывает, события от нажатия мыши передают прямо через.Пока все хорошо. IsHitTestvisible имеет значение false на объекте контуров. Таким образом, события от нажатия мыши пройдут через него к другим средствам управления на той же форме (т.е. можно нажать на Кнопку, потому что это находится на той же форме).

Но привычка событий от нажатия мыши проходит через Объект контуров на окна, которые являются ниже его.

Какие-либо идеи? Или лучшие способы решить эту проблему?

Спасибо.

33
задан RMK 16 May 2010 в 05:13
поделиться

2 ответа

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

for your window set:

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

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

58
ответ дан 27 November 2019 в 18:13
поделиться

То, что вы описали, похоже на ожидаемое поведение. Одно из решений - установить Fill в {x:Null} в Path, поскольку это единственный надежный способ сделать так, чтобы объект не попал в тест.

2
ответ дан 27 November 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: