Process 删除窗口或窗体的父级

Process 删除窗口或窗体的父级,process,window,pinvoke,parent-child,Process,Window,Pinvoke,Parent Child,如何使父进程被设置为应用程序控件的进程从应用程序中“弹出”并成为顶级窗口 我尝试过使用SetParent(WindowHandle,null)但IntPtr表示它是不可为空的类型。检查任何顶级窗口的父窗口使用以下内容: [DllImport("User32.dll", SetLastError = true)] public static extern IntPtr GetParent(IntPtr hWnd); 结果是“0” 因此,您可以使流程成为顶级窗口,如下所示:

如何使父进程被设置为应用程序控件的进程从应用程序中“弹出”并成为顶级窗口


我尝试过使用
SetParent(WindowHandle,null)但IntPtr表示它是不可为空的类型。

检查任何顶级窗口的父窗口使用以下内容:

    [DllImport("User32.dll", SetLastError = true)]
    public static extern IntPtr GetParent(IntPtr hWnd);
结果是“0”

因此,您可以使流程成为顶级窗口,如下所示:

    SetParent(WindowHandle, IntPtr.Zero);

使用以下命令检查任何顶级窗口的父窗口:

    [DllImport("User32.dll", SetLastError = true)]
    public static extern IntPtr GetParent(IntPtr hWnd);
结果是“0”

因此,您可以使流程成为顶级窗口,如下所示:

    SetParent(WindowHandle, IntPtr.Zero);

您正在尝试修改窗口的父级。您需要的功能是。您的p/invoke如下所示:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
SetParent(hWnd, IntPtr.Zero);
从文件中:

hWndNewParent

新父窗口的句柄。如果此参数为NULL,则 桌面窗口成为新的父窗口

因此,只需将
NULL
传递为
hWndNewParent
。用C#术语来说,就是这样做的:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
SetParent(hWnd, IntPtr.Zero);
然而,还有更多。在备注中,您将看到以下文字:

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

因此,在您的情况下,确实需要修改窗口的窗口样式。您需要清除
WS\u CHILD
,并设置
WS\u弹出窗口

uint style = GetWindowLong(hWnd, GWL_STYLE);
style = (style | WS_POPUP) & (~WS_CHILD);
SetWindowLong(hWnd, GWL_STYLE, style);

您正在尝试修改窗口的父级。您需要的功能是。您的p/invoke如下所示:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
SetParent(hWnd, IntPtr.Zero);
从文件中:

hWndNewParent

新父窗口的句柄。如果此参数为NULL,则 桌面窗口成为新的父窗口

因此,只需将
NULL
传递为
hWndNewParent
。用C#术语来说,就是这样做的:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
SetParent(hWnd, IntPtr.Zero);
然而,还有更多。在备注中,您将看到以下文字:

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

因此,在您的情况下,确实需要修改窗口的窗口样式。您需要清除
WS\u CHILD
,并设置
WS\u弹出窗口

uint style = GetWindowLong(hWnd, GWL_STYLE);
style = (style | WS_POPUP) & (~WS_CHILD);
SetWindowLong(hWnd, GWL_STYLE, style);

这个问题毫无意义,您的应用程序中没有单独的“托管进程”。只有一个。@HansPassant我试图纠正我对术语的使用。@HansPassant“managed”不是正确的词。。。我的应用程序使用WindowsFormsHost作为其已启动进程的父进程。这个问题毫无意义,您的应用程序中没有单独的“托管进程”。只有一个。@HansPassant我试图纠正我对术语的使用。@HansPassant“managed”不是正确的词。。。我的应用程序使用WindowsFormsHost作为已启动进程的父进程。