0

如果我直接创建一个,那么我是否还创建了一个现在可以从代码访问HwndSource的 WPF ?Window如果是这样,我该如何访问它?

或者我现在需要以某种方式“添加”一个 WPFWindowHwndSource?如果是这样,我该怎么做?

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

编辑:我一直在研究我能找到的每一个问题HwndSource;看起来您通过将对象的属性设置为要显示的 WPF 对象,将WPF对象“添加”到对象;或者也许通过调用方法?接下来将检查那些。希望这对其他提问者有用。HwndSourceRootVisualHwndSourceHwndSource AddSource

4

1 回答 1

2

正如我所怀疑的,解决方案是将您的 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;
        }
    }
于 2015-07-09T00:12:01.373 回答