Oku*_*ott 1 pinvoke window process parent-child
如何使父进程设置为我的应用程序的控件“弹出”我的应用程序并成为顶级窗口?
我试过使用SetParent(WindowHandle, null);但 IntPtr 它说它是一个不可为空的类型。
您正在尝试修改窗口的父级。您需要的功能是SetParent. 你的 p/invoke 看起来像这样:
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
Run Code Online (Sandbox Code Playgroud)
从文档:
hWndNewParent
新父窗口的句柄。如果此参数为 NULL,则桌面窗口将成为新的父窗口。
因此,您只需将其NULL作为hWndNewParent. 在 C# 术语中,这是这样完成的:
SetParent(hWnd, IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)
然而,还有更多。在备注中,您将找到以下文字:
出于兼容性原因,SetParent 不会修改正在更改其父级的窗口的 WS_CHILD 或 WS_POPUP 窗口样式。因此,如果 hWndNewParent 为 NULL,您还应该在调用 SetParent 后清除 WS_CHILD 位并设置 WS_POPUP 样式。相反,如果 hWndNewParent 不为 NULL 并且窗口以前是桌面的子窗口,则应在调用 SetParent 之前清除 WS_POPUP 样式并设置 WS_CHILD 样式。
因此,在您的情况下,您确实需要修改窗口的窗口样式。您需要清除WS_CHILD和设置WS_POPUP。
uint style = GetWindowLong(hWnd, GWL_STYLE);
style = (style | WS_POPUP) & (~WS_CHILD);
SetWindowLong(hWnd, GWL_STYLE, style);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2174 次 |
| 最近记录: |