2015-06-12 3 views
0

Я новичок в визуальном базовом. Я пытаюсь создать приложение, которое может контролировать мое другое приложение.Отсоедините дочернее окно от родительского окна с помощью другого приложения

Итак, у моего первого приложения есть дочернее окно внутри главного окна.

Я хочу, чтобы мое второе приложение могло контролировать мое первое приложение. Нажав кнопку на моем втором приложении, она должна сделать дочернее окно в первом приложении отдельным окном. Окно будет свободно перемещаться за пределы исходного родительского окна. Он должен действовать как отдельное окно. Детское окно остается, даже если исходное родительское окно минимизировано.

Мне нравится работать, но это не так, как ожидалось.

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 
+0

Ну, даже если дочернее окно отделено от исходного родительского окна, родительский процесс все еще имеет к нему дескриптор и будет управлять окном, как если бы он был дочерним (поскольку он не ожидает, что он будет удален). Единственный способ преодолеть это - часто обновлять статус дочернего окна (например, «ShowWindow» (..) »,« MoveWindow (..) »или такие функции), но это может привести к странному поведению окна (например, окно минимизирует и всплывает снова и так далее) ... –

+0

Приложения * не должны * связываться с иерархиями окон других приложений. В этом случае, поскольку вы управляете обоими приложениями, попросите одно приложение отправить сообщение другому, чтобы сообщить ему заменить дочернее окно отдельным окном. –

ответ

0

Не пытайтесь повторно подключить ребенка к другому окну. Пока вы можете позвонить SetParent, it will be very, very hard, чтобы сделать все правильно и решить все проблемы, которые возникают из него. Это как если бы вам сказали, что у кого-то сейчас ваш родитель. Могут ли все вовлеченные люди действительно вести себя так, как будто это правда?

Решение вашей проблемы будет иметь первое приложение, имеющее два окна, разделяющих один и тот же код: дочернее окно и не-дочернее окно. Вы просто скроете тот, который вам не нужен.

Однако у меня есть чувство, что вы пытаетесь достичь чего-то, что имеет более прямое и простое решение. Вы должны описать, какую проблему вы пытаетесь решить, извлекая окно.

Смежные вопросы