2014-11-10 2 views
3

Чтобы реализовать стыковку, я полагался на прослушивание события Window.LocationChanged, чтобы обнаружить изменяющуюся позицию окна, перемещаемого по экрану. Но пользователь сообщил, что док-станция не работает на своей машине.LocationChanged не надежно вызывается при перетаскивании окна

Оказывается, они отключили «Показывать содержимое окна при перетаскивании» в параметрах производительности Windows, и в результате событие LocationChanged запускается только после того, как окно переместится в конечную позицию, а не пока окно находится в середине полета.

Мне было интересно, был ли альтернативный способ обнаружения движений окна, хороший способ. Я знаю, что смогу приколоть или подключить какой-то ужасный таймер, но я надеялся на лучший способ, возможно, есть надежное событие для прослушивания?

Здесь вы можете предотвратить любые «вы не отправляли код»/«что вы пробовали».

protected override void OnLocationChanged(EventArgs e) 
{ 

} 
+0

Я не знаю ни одного WPF API для обнаружения, когда окно движется в этих условиях. '[Preview] MouseMove' не срабатывает, когда мышь находится над неклиентской областью, и, как вы заметили, функция« LocationChanged »срабатывает при перетаскивании, если« отображать содержимое окна при перетаскивании ». Вам, вероятно, придется сделать p/invoke или, наоборот, нарисовать собственный хром (но даже это может не сработать, если вы вызовете DragMove для обработки перетаскивания окон). Кроме того, проверка состояния мыши не охватывает все движения окна - вы можете инициировать и завершать перенос окон, используя только клавиатуру. –

+0

*** Я знаю, что могу выплеснуть ***, поэтому просто сделай так. Я не думаю, что здесь есть что-то лучшее. Также pinvoke не является чем-то плохим, это на самом деле иногда единственное решение, которое у вас есть. –

ответ

2

Вот мое решение,

Отличная работа.

class MyWindow : Window 
{ 
    private const int WM_MOVING = 0x0216; 
    private HwndSource _hwndSrc; 
    private HwndSourceHook _hwndSrcHook; 

    public MyWindow() 
    { 
     Loaded += OnLoaded; 
     Unloaded += OnUnloaded; 
    } 

    void OnUnloaded(object sender, RoutedEventArgs e) 
    { 
     _hwndSrc.RemoveHook(_hwndSrcHook); 
     _hwndSrc.Dispose(); 
     _hwndSrc = null; 
    } 

    void OnLoaded(object sender, RoutedEventArgs e) 
    { 
     _hwndSrc = HwndSource.FromDependencyObject(this) as HwndSource; 
     _hwndSrcHook = FilterMessage; 
     _hwndSrc.AddHook(_hwndSrcHook); 
    } 

    private IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
    { 
     switch (msg) 
     { 
      case WM_MOVING: 
       OnLocationChange(); 
       break; 
     } 

     return IntPtr.Zero; 
    } 

    private void OnLocationChange() 
    { 
     //Do something 
    } 
} 
Смежные вопросы