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作为已启动进程的父进程。