为了实现对接我依赖于监听Window.LocationChanged事件来检测在屏幕上拖动的窗口的变化位置。但是一位用户报告说他们的机器上没有对接功能。
原来他们已经禁用"在拖动时显示窗口内容"在Windows性能选项中,因此只有在窗口移动到最终位置时才会触发LocationChanged事件,而不是在窗口处于飞行途中时。
我想知道是否有另一种检测窗口移动的方法,这是一种很好的方法。我知道我可以用pinvoke,或者连接一些可怕的计时器,但我希望有一个更好的方法,也许有一个可靠的事件要听吗?
这是一种预防任何"你没有发布任何代码的方法" /"你尝试了什么"投诉。
protected override void OnLocationChanged(EventArgs e)
{
}
答案 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
}
}