4

我的 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);

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

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

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

4

3 回答 3

7

我发现即使不使用 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;

现在效果很好,没有任何问题。

于 2012-05-20T23:38:14.550 回答
1

我不确定您需要对重叠的窗口做什么,但来自 MSDN:

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

于 2012-05-20T20:21:04.807 回答
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.");
    }
}
于 2018-01-04T14:48:25.560 回答