将窗口附加到另一个进程的窗口

我的WPF应用程序有多个窗口,我想将其中一些窗口附加到另一个进程的窗口。 我的问题是,一旦我连接窗户,它就变得不可见了。

我正在尝试使用以下代码:

public static bool setParentWindow(IntPtr hWndChild, IntPtr hWndNewParent) { IntPtr previousParent = SetParent(hWndChild, hWndNewParent); return (previousParent == null ? false : true); } [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); setParentWindow(myWindowHwnd, newParentHwnd); 

因此,上面的代码成功地附加了窗口,但不幸的是它使它不可见。

我这样做的原因是我试图通过为它构建“Widgets”来扩展应用程序,我的小部件将挂钩并向用户显示额外信息。

两个窗口都具有以下样式:WS_OVERLAPPEDWINDOW,WS_OVERLAPPED,WS_VISIBLE,WS_CLIPSIBLINGS,WS_CLIPCHILDREN。

我发现即使使用setParent调用我也可以这样做。 我使用HwndSource类如下:

 MyWindow window = new MyWindow(); window.ShowActivated = true; HwndSourceParameters parameters = new HwndSourceParameters(); parameters.WindowStyle = 0x10000000 | 0x40000000; parameters.SetPosition(0, 0); parameters.SetSize((int)window.Width, (int)window.Height); parameters.ParentWindow = newParent; parameters.UsesPerPixelOpacity = true; HwndSource src = new HwndSource(parameters); src.CompositionTarget.BackgroundColor = Colors.Transparent; src.RootVisual = (Visual)window.Content; 

现在这很好用,没有任何问题。

我不确定你需要对重叠窗口做什么,但是从MSDN:

出于兼容性原因, SetParent不会修改其父级正在更改的窗口的WS_CHILDWS_POPUP窗口样式。 因此,如果hWndNewParentNULL ,则还应清除WS_CHILD位并在调用SetParent后设置WS_POPUP样式。 相反,如果hWndNewParent不为NULL且窗口以前是桌面的子项,则应在调用SetParent之前清除WS_POPUP样式并设置WS_CHILD样式。

 private void TryToAttach(IntPtr ownerHandle) { if(ownerHandle == IntPtr.Zero) { return; } try { var helper = new WindowInteropHelper(window) { Owner = ownerHandle }; } catch(Exception e) { Logger.Error(e, "Could not attach window."); } }