c# - 拖动窗口时不能可靠地调用 LocationChanged

标签 c# wpf

为了实现停靠,我依靠监听 Window.LocationChanged 事件来检测在屏幕上拖动的窗口的位置变化。但一位用户报告说,对接在他们的机器上无法正常工作。

原来他们在 Windows 性能选项中禁用了“拖动时显示窗口内容”,因此 LocationChanged 事件仅在窗口移动到其最终位置时触发,而不是在窗口处于飞行途中时触发。

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

这里有一个方法可以防止任何“你没有发布任何代码”/“你尝试了什么”的提示。

protected override void OnLocationChanged(EventArgs e)
{

}

最佳答案

这是我的解决方案,

出色的工作。

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

关于c# - 拖动窗口时不能可靠地调用 LocationChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26847278/

相关文章:

c# - 将 InputAccessoryView 设置为 UISearchController

c# - 控制台信息到窗口

c# - 如何更新其他类(class)的进度条?

c# - CollectionViewSource 违反 MVVM

wpf - Resource 中的 DataTemplate 将 ViewModel 设置为 View,但随后

c# - 应用程序自动关闭

c# - 从 pfx 文件中提取公钥(类似程序集)

c# - 是否有更有效的 LINQ 语句来反向搜索 List<T> 中的条件?

c# - 这段 RxUI 代码有什么问题?

wpf - 调用线程无法访问该对象,因为另一个线程拥有它