为了实现停靠,我依靠监听 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/