代码之家  ›  专栏  ›  技术社区  ›  The Newbie

将子窗口释放回桌面?

  •  1
  • The Newbie  · 技术社区  · 6 年前

    我使用这些库来找到一个窗口,并将它的句柄设置为一个新的句柄,就像程序中的一个选项卡。但是,我很难将程序释放回桌面。关闭主应用程序后,捕获的窗口也将关闭。有人能帮我一下吗?谢谢您!

    图书馆:

    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 回复  |  直到 6 年前
        1
  •  3
  •   Visual Vincent    6 年前

    the documentation 以下内容:

    setParent函数

    参数

    (…)

    HwndNewParent公司 [输入,可选]

    类型: HWND

    新父窗口的句柄。如果这个参数是 无效的 ,桌面窗口将成为新的父窗口。(…)

    所以你只要打个电话 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 共享。它更详细地解释了这种情况,并有助于给出一个视角。