将子窗口释放回桌面?

时间:2018-07-13 22:34:52

标签: vb.net winapi pinvoke setparent

我正在使用这些库来查找窗口并将其句柄设置为新的句柄,例如程序中的选项卡。但是,我很难将程序发布回桌面。关闭主应用程序后,捕获的窗口也会关闭。有人可以帮我吗?谢谢!

图书馆:

Private Declare Function SetParent Lib "user32" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As Integer
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr

这是我捕获运行中的应用程序的方式,例如将记事本捕获到程序的活动选项卡中:

SetParent(FindWindow(vbNullString, "Untitled - Notepad"), TabControl1.SelectedTab.Handle)

将窗口捕获到我的标签页中时,此方法工作正常,但是如何将其从我的标签页中移回桌面呢?

1 个答案:

答案 0 :(得分:3)

the documentation

  

SetParent函数

     

参数

     

(...)

     

hWndNewParent [in,可选]

     

类型: HWND

     

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

因此,您要做的就是再次调用SetParent(),将第二个参数设置为Nothing

'Class-level variable (so that you can reference the window later on again).
Dim NotepadHandle As IntPtr
'Adding it into your application.
NotepadHandle = FindWindow(Nothing, "Untitled - Notepad")
SetParent(NotepadHandle, TabControl1.SelectedTab.Handle)
'Removing it from your application.
SetParent(NotepadHandle, Nothing)

重要提示:请谨慎使用!更改属于另一个进程(或只是另一个线程,甚至是您自己的应用程序中的一个线程)的窗口的父窗口可能会导致问题,尤其是当该窗口从顶级窗口(即没有父窗口的独立窗口)移开时而不是桌面)添加到子窗口。

如果处理该窗口的应用程序并非旨在支持此功能,则可能导致各种问题,并且您永远无法真正确定会发生什么情况,因为这完全取决于应用程序的编码方式以及它可能决定或决定的事情。被指示去做。

我建议阅读link共享的IInspectable。它更详细地解释了这种情况,并有助于给出一个角度。