C# 如何获得WPF窗口;从「;我直接创建的HwndSource?

C# 如何获得WPF窗口;从「;我直接创建的HwndSource?,c#,wpf,interop,wpf-interop,hwndsource,C#,Wpf,Interop,Wpf Interop,Hwndsource,如果我直接创建了一个HwndSource,那么我是否也创建了一个WPF窗口,现在我可以从代码中访问它?如果是,我如何访问它 或者我现在是否需要在HwndSource中“添加”一个WPF窗口?如果是,我该怎么做 我已经彻底地研究了HwndSource文档,但这一部分根本没有得到很好的解释。我知道我可以从现有的WPF窗口获取HwndSource,但这对我没有帮助。我需要拦截窗口的创建,这样我就可以强制它使用WS_CHILD样式,并直接设置它的父级;文档中说,如果要强制创建HwndSource的父级,

如果我直接创建了一个
HwndSource
,那么我是否也创建了一个WPF
窗口
,现在我可以从代码中访问它?如果是,我如何访问它

或者我现在是否需要在
HwndSource
中“添加”一个WPF
窗口?如果是,我该怎么做

我已经彻底地研究了
HwndSource
文档,但这一部分根本没有得到很好的解释。我知道我可以从现有的WPF窗口获取
HwndSource
,但这对我没有帮助。我需要拦截
窗口的创建
,这样我就可以强制它使用
WS_CHILD
样式,并直接设置它的父级;文档中说,如果要强制创建HwndSource的父级,则必须直接创建HwndSource


编辑:我一直在研究我能在
HwndSource
中找到的每一个问题;通过将
HwndSource
对象的
RootVisual
属性设置为要显示的WPF对象,似乎可以将WPF对象“添加”到
HwndSource
对象中;或者调用
HwndSource
AddSource
方法?我们将在下一步对其进行检查。希望这对其他提问者有用。

正如我所怀疑的,解决方案是将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;
        }
    }