【问题标题】:Release child window back to desktop?将子窗口释放回桌面?
【发布时间】:2018-07-13 22:34:52
【问题描述】:

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

图书馆:

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)

在将窗口捕获到我的标签页时,这可以正常工作,但是我如何将该窗口从我的标签页中删除回到桌面上?

【问题讨论】:

标签: vb.net winapi pinvoke setparent


【解决方案1】:

the documentation:

设置父函数

参数

(...)

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 共享的link。它更详细地解释了这种情况,并有助于给出一个观点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    相关资源
    最近更新 更多