拖动窗口时,无法可靠地调用LocationChanged

时间:2014-11-10 15:35:41

标签: c# wpf

为了实现对接我依赖于监听Window.LocationChanged事件来检测在屏幕上拖动的窗口的变化位置。但是一位用户报告说他们的机器上没有对接功能。

原来他们已经禁用"在拖动时显示窗口内容"在Windows性能选项中,因此只有在窗口移动到最终位置时才会触发LocationChanged事件,而不是在窗口处于飞行途中时。

我想知道是否有另一种检测窗口移动的方法,这是一种很好的方法。我知道我可以用pinvoke,或者连接一些可怕的计时器,但我希望有一个更好的方法,也许有一个可靠的事件要听吗?

这是一种预防任何"你没有发布任何代码的方法" /"你尝试了什么"投诉。

protected override void OnLocationChanged(EventArgs e)
{

}

1 个答案:

答案 0 :(得分:3)

这是我的解决方案,

出色的工作。

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