我们正在开发一个WPF应用程序,在某些情况下会打开一个额外的窗口,该窗口应始终停靠在父(主)窗口上。我们目前正在挂钩主应用程序并使用窗口消息:
private void OnLoaded()
{
//...
HwndSource.FromHwnd(handle).RemoveHook(OwnerWindowProc);
}
private IntPtr OwnerWindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
switch (msg)
{
case WM_MOVE:
case WM_MOVING:
RefreshPosition();
break;
}
return (IntPtr)0;
}
private void RefreshPosition()
{
var newLeft = Owner.Width + Owner.Left;
var newTop = VerticalOffset + Owner.Top;
Left = newLeft;
Top = newTop;
}
这种方法非常有效,除了一些罕见的情况,当你非常快地放下窗户时 - 额外的窗口只是停留在一个过时的位置,这显然是不正确的。
另一个/我想到了另一种方法。每次x MS检查窗口位置,或者每次处理窗口消息时开始/重新启动计时器,以便延迟更新过程。还有其他想法吗?