C# 如何在WPF应用程序的用户控件中定位Win32浮动窗口?

C# 如何在WPF应用程序的用户控件中定位Win32浮动窗口?,c#,wpf,winapi,interop,C#,Wpf,Winapi,Interop,使用从HwndHost派生的类和一些伏都教代码: protected override HandleRef BuildWindowCore(HandleRef hwndHost) { CheckGuestValidity(); var guestHwnd = new HandleRef(GuestHwnd, _guestHwnd); Win32.SetWindowStyle(guestHwnd.Handle, WindowStyles.WS_CHILD | Win32.GetWind

使用从
HwndHost
派生的类和一些伏都教代码:

protected override HandleRef BuildWindowCore(HandleRef hwndHost)
{
  CheckGuestValidity();
  var guestHwnd = new HandleRef(GuestHwnd, _guestHwnd);
  Win32.SetWindowStyle(guestHwnd.Handle, WindowStyles.WS_CHILD | Win32.GetWindowStyle(guestHwnd.Handle));
  WindowsFormsHost.EnableWindowsFormsInterop();
  System.Windows.Forms.Application.EnableVisualStyles();
  Win32.SetParent(guestHwnd.Handle, hwndHost.Handle);
  Win32.SetWindowStyle(_guestHwnd, Win32.GetWindowStyle(_guestHwnd) & ~WindowStyles.WS_CAPTION);
  return guestHwnd;
}

我已经设法从Delphi COM服务器获得了一个无父窗口(Windows的主窗口除外),以采用我的WPF应用程序窗口作为父窗口。问题是它位于WPF窗口最底部的所有其他用户控件下。我想调整它的大小和位置,使其适合TabControl中选项卡上的矩形。我该怎么办?我意识到需要一些调整大小和定位Win32 API调用,甚至可能需要一些低级Windows消息,但我已经准备好了。

首先,我找到了一个方便的小类,可以在坐标系之间进行转换。这是@Lu55对这个问题的答案,而不是公认的答案

然后,我的
WindowHostView
XAML如下所示:

<Grid x:Name="WindowContainer" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Coral" >
  <delphi:Win32WindowHost x:Name="Host" />
</Grid>
而且
Win32Api.MoveWindow
是非常旧的:

[DllImport("user32.dll", SetLastError = true)]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);