Я новичок в визуальном базовом. Я пытаюсь создать приложение, которое может контролировать мое другое приложение.Отсоедините дочернее окно от родительского окна с помощью другого приложения
Итак, у моего первого приложения есть дочернее окно внутри главного окна.
Я хочу, чтобы мое второе приложение могло контролировать мое первое приложение. Нажав кнопку на моем втором приложении, она должна сделать дочернее окно в первом приложении отдельным окном. Окно будет свободно перемещаться за пределы исходного родительского окна. Он должен действовать как отдельное окно. Детское окно остается, даже если исходное родительское окно минимизировано.
Мне нравится работать, но это не так, как ожидалось.
The problems I encounter now are:
1. After the child window is detached, the child window still reminds in a background
frame looks like the background of its original parent window. I want the window to
be on the desktop.
2. After the child window is detached, the child window minimize with its main window.
I want the child window stay even if I minimize the main window.
Ниже приведен код моей программы:
В основном он пытается получить дескриптор главного окна через заголовок окна, а затем получить ручку своего ребенка окна и использовать функцию SetParent для изменения родительского элемента на рабочий стол, поэтому он отображается непосредственно на рабочем столе.
Я знаю, что могут быть другие способы сделать это, и, пожалуйста, дайте мне знать. Было бы очень полезно, если бы вы были конкретными, так как я упомянул, что я новичок в визуальном базовом. Мой код может выглядеть грязным, извините. : P Спасибо всем!
Option Explicit On
Public Class FormG
Const GW_CHILD = 5
Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Declare Function SetParent Lib "user32.dll" (ByVal hWndChild As Integer, ByVal hWndNewParent As Integer) As Integer
Private Declare Function GetDesktopWindow Lib "user32.dll"() As Long
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim r As Int32, hChild As Long, desk As Long
r = FindWindow(vbNullString, "Form1")
hChild = GetWindow(r, GW_CHILD)
desk = GetDesktopWindow()
SetParent(hChild, desk)
End Sub
End Class
Ну, даже если дочернее окно отделено от исходного родительского окна, родительский процесс все еще имеет к нему дескриптор и будет управлять окном, как если бы он был дочерним (поскольку он не ожидает, что он будет удален). Единственный способ преодолеть это - часто обновлять статус дочернего окна (например, «ShowWindow» (..) »,« MoveWindow (..) »или такие функции), но это может привести к странному поведению окна (например, окно минимизирует и всплывает снова и так далее) ... –
Приложения * не должны * связываться с иерархиями окон других приложений. В этом случае, поскольку вы управляете обоими приложениями, попросите одно приложение отправить сообщение другому, чтобы сообщить ему заменить дочернее окно отдельным окном. –