Вернуть дочернее окно обратно на рабочий стол?
Я использую эти библиотеки, чтобы найти окно и установить его дескриптор на новый дескриптор, как вкладка в моей программе. Однако мне трудно выпустить программу обратно на рабочий стол. Когда я закрываю свое основное приложение, захваченное окно также закрывается. Может ли кто-нибудь помочь мне, пожалуйста? благодарю вас!
Библиотека:
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 ответ
Согласно документации:
Функция 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)
ВАЖНО: используйте это с осторожностью! Изменение родительского элемента окна, принадлежащего другому процессу (или просто другому потоку, даже одному в вашем собственном приложении) может вызвать проблемы, особенно когда это окно перемещается из окна верхнего уровня (то есть автономного окна без родительского элемента кроме рабочего стола) в дочернее окно.
Если приложение, обрабатывающее окно, не было разработано для поддержки этого, оно может вызвать всевозможные проблемы, и вы никогда не сможете точно знать, что может произойти, потому что все зависит от того, как приложение было закодировано, и что оно может решить или получить инструкции. делать.
Я рекомендую прочитать ссылку, IInspectable поделился IInspectable. Это объясняет ситуацию немного подробнее и помогает дать представление о ней.