2

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

图书馆 :

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)

这在将窗口捕获到我的标签页时效果很好,但是我如何将该窗口从我的标签页中删除回到桌面上?

4

1 回答 1

4

根据文档

设置父函数

参数

(...)

hWndNewParent [输入,可选]

类型: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)

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

如果处理窗口的应用程序不是为支持这一点而设计的,它可能会导致各种问题,并且您永远无法确定会发生什么,因为这完全取决于应用程序的编码方式以及它可能决定或被指示的内容做。

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

于 2018-07-13T22:47:10.110 回答