正如我所怀疑的,解决方案是将您的 WPF 对象添加到 HwndSource.RootVisual 对象。在下面的示例中,NativeMethods 是我的 Win32 API 的 PInvoke 类。使用 SetLastError 和 GetLastError 检查 Windows 错误。
请注意,在这种情况下,您必须使用用户控件或页面等;您不能将 HwndSource.RootVisual 设置为现有的或“新的”WPF 窗口,因为 WPF 窗口已经有一个父级,并且它不会接受具有父级的对象。
private void ShowPreview(IntPtr hWnd)
{
if (NativeMethods.IsWindow(hWnd))
{
// Get the rect of the desired parent.
int error = 0;
System.Drawing.Rectangle ParentRect = new System.Drawing.Rectangle();
NativeMethods.SetLastErrorEx(0, 0);
bool fSuccess = NativeMethods.GetClientRect(hWnd, ref ParentRect);
error = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
// Create the HwndSource which will host our Preview user control
HwndSourceParameters parameters = new HwndSourceParameters();
parameters.WindowStyle = NativeMethods.WindowStyles.WS_CHILD | NativeMethods.WindowStyles.WS_VISIBLE;
parameters.SetPosition(0, 0);
parameters.SetSize(ParentRect.Width, ParentRect.Height);
parameters.ParentWindow = hWnd;
HwndSource src = new HwndSource(parameters);
// Create the user control and attach it
PreviewControl Preview = new PreviewControl();
src.RootVisual = Preview;
Preview.Visibility = Visibility.Visible;
}
}