我的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。
答案 0 :(得分:6)
我发现即使使用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;
现在这很好用,没有任何问题。
答案 1 :(得分:1)
我不确定您需要对重叠窗口做什么,但是来自MSDN:
出于兼容性原因,SetParent不会修改其父级正在更改的窗口的 WS_CHILD 或 WS_POPUP 窗口样式。因此,如果 hWndNewParent NULL ,则还应清除 WS_CHILD 位并在调用<后设置 WS_POPUP 样式强>的setparent 即可。相反,如果 hWndNewParent 不是 NULL 且窗口以前是桌面的子项,则应清除 WS_POPUP 样式并设置 SetParent 之前的> WS_CHILD 样式。
答案 2 :(得分:0)
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.");
}
}