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;
}
}