GetObject в MDI Form

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
caa2000
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 14.05.2009 (Чт) 4:50

GetObject в MDI Form

Сообщение caa2000 » 26.04.2021 (Пн) 15:01

Здравствуйте всем.
Запарился искать.
Подскажите плз, есть обьект, к примеру окно Windows Explorer-а. Нужно его поместить в MDI form.
Код: Выделить всё
Set obj = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
            obj.Visible = True
            obj.Navigate "\\"

Создаёт в Screen-е , а как его поместить в MDI форму.
Предпологается несколько окон в форме.
Имеющий уши, да услышит.. (с) Новый Завет От Матфея святое благовествование

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: GetObject в MDI Form

Сообщение Хакер » 26.04.2021 (Пн) 17:07

caa2000 писал(а):Запарился искать.

А зачем искать? Надо самому думать, а не искать чужое.

И кто вообще сказал, что так можно сделать? Официально так нельзя. Нет у интерфейса, который имеет создаваемый объект класса {C08AFD90-F2A1-11D1-8455-00A0C91F3880} методов, для внедрения в чужую MDI-форму. Есть некий шанс, поизучав набор поддерживаемых интерфейсов этого объекта, обнаружить интерфейсы для OLE-встраивания, да и то это будут инструменты для встраивания в качестве контрола.

Есть грязный хак, состоящий в том, чтобы с помощью SetParent перекинуть окно проводника внутрь MDI-контейнера. У дефолтного интерфейса объекта класса {C08AFD90-F2A1-11D1-8455-00A0C91F3880} есть свойство hWnd. hWnd MDI-контейнера придётся искать у MDI-окна с помощью FindWindow.

Но это дверь в ад, потому что в норме все окна, состоящие в иерархии родитель-ребёнок/контейнер-содержимое должны принадлежать одному и тому же потоку. Если украсть чужое окно и затолкать его ребёнком в своё окно, получится что родительское и дочернее окно принадлежат разным потокам разным разных процессов. Это разрешённый, но тяжелый случай, потому что возникает куча сложностей с правильной обработкой очередей ввода (input queue), а также с тем, что программа, окно которой украли, совершенно не в курсе, что его окна, которое по задумке должно быть top-level-окном, окажется child-окном внутри какого-то чужого top-level-окна.

Самым нейтральным и безопасным способом было бы создать форму, переключить её в режим MDIChild и в ней расположить контрол класса WebBrowser и в нём с помощью Navigate открыть интересующую папку.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: GetObject в MDI Form

Сообщение Хакер » 26.04.2021 (Пн) 17:12

Если всё же не пропал соблазн пойти путём через использование SetParent, рекомендую ознакомиться с этими статьями Реймонда Чена и ещё раз подумать:

Is it legal to have a cross-process parent/child or owner/owned window relationship?

Sharing an input queue takes what used to be asynchronous and makes it synchronous, like focus changes
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

caa2000
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 14.05.2009 (Чт) 4:50

Re: GetObject в MDI Form

Сообщение caa2000 » 27.04.2021 (Вт) 4:52

Хакер писал(а):
caa2000 писал(а):Запарился искать.

А зачем искать? Надо самому думать, а не искать чужое.

Так а зачем тогда Google и поиск на форуме ? :D

Пробовал с SetParent - геморойно получается подгонять окошки под MDI resize.
Попробовал WebBrowser control
Красиво. Но выскакивает сообщение "Run-Time Error -1 ffffffff". Что оно означает и как с ним бороться?
Взял за основу сандартный VB Application Wizard проект с WebBrowser-ом.
Выскакивает после клика на икону и перехода на другой адрес. Именно, после того, как окно обновилось.
Я с webBrowser-om впервые столкнулся.
Имеющий уши, да услышит.. (с) Новый Завет От Матфея святое благовествование

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: GetObject в MDI Form

Сообщение Teranas » 27.04.2021 (Вт) 21:16

компонент webBrowser жутко глючный, не для новичков, там всё надо оборачивать в обработчик ошибок, даже любую херню с ифками...
С уважением, Андрей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: GetObject в MDI Form

Сообщение Хакер » 27.04.2021 (Вт) 21:21

Teranas писал(а):компонент webBrowser жутко глючный, не для новичков, там всё надо оборачивать в обработчик ошибок, даже любую херню с ифками...

Конкретика будет, чем он глючный?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

caa2000
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 14.05.2009 (Чт) 4:50

Re: GetObject в MDI Form

Сообщение caa2000 » 27.04.2021 (Вт) 22:10

Teranas писал(а):компонент webBrowser жутко глючный, не для новичков, там всё надо оборачивать в обработчик ошибок, даже любую херню с ифками...

Да я уже понял. Зато удобныый Explore-овский интерфейс. Своё такое геморойно делать.
А ту ошибку запарился отлавливать.
Обнаружил прикол: Выскакивает именно на 3-ий клик. Т. е. после третьего перехода по адресу:
C:\ -StartupAddress > 1. Programm Files 2.AVG 3. Antivirus -- О-ба! Microsoft Visual Basic Run-Time Error -1 ffffffff
И не важео, что кликать. Хоть 1.Date modifed (в Colunm Headere) 2.Users 3. Public - Microsoft Visual Basic Run-Time Error -1 ffffffff
Третий клик- ошибка !
Код: Выделить всё
Public StartingAddress As String '= "C:\"
Dim mbDontNavigateNow As Boolean

Private Sub Form_Load()
    On Error Resume Next
    Me.Show
    tbToolBar.Refresh
    Form_Resize
    cboAddress.Move 50, lblAddress.Top + lblAddress.Height + 15
    If Len(StartingAddress) > 0 Then
        cboAddress.Text = StartingAddress
        cboAddress.AddItem cboAddress.Text
        'try to navigate to the starting address
        timTimer.Enabled = True
        brwWebBrowser.Navigate StartingAddress
    End If
End Sub

Private Sub brwWebBrowser_DownloadComplete()
    On Error Resume Next
    Me.Caption = brwWebBrowser.LocationName
End Sub

Private Sub brwWebBrowser_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
    On Error Resume Next
    Dim i As Integer
    Dim bFound As Boolean
    Me.Caption = brwWebBrowser.LocationName
    For i = 0 To cboAddress.ListCount - 1
        If cboAddress.List(i) = brwWebBrowser.LocationURL Then
            bFound = True
            Exit For
        End If
    Next i
    mbDontNavigateNow = True
    If bFound Then
        cboAddress.RemoveItem i
    End If
    cboAddress.AddItem brwWebBrowser.LocationURL, 0
    cboAddress.ListIndex = 0
    mbDontNavigateNow = False
End Sub

Private Sub cboAddress_Click()
    If mbDontNavigateNow Then Exit Sub
    timTimer.Enabled = True
    brwWebBrowser.Navigate cboAddress.Text
End Sub

Private Sub cboAddress_KeyPress(KeyAscii As Integer)
    On Error Resume Next
    If KeyAscii = vbKeyReturn Then
        cboAddress_Click
    End If
End Sub

Private Sub Form_Resize()
    On Error Resume Next
    cboAddress.Width = Me.ScaleWidth - 100
    brwWebBrowser.Width = Me.ScaleWidth - 100
    brwWebBrowser.Height = Me.ScaleHeight - (picAddress.Top + picAddress.Height) - 100
End Sub

Private Sub timTimer_Timer()
    If brwWebBrowser.Busy = False Then
        timTimer.Enabled = False
        Me.Caption = brwWebBrowser.LocationName
    Else
        Me.Caption = "Working..."
    End If
End Sub


Кстати: Any Folder+Page Back+Page Previous = Microsoft Visual Basic Run-Time Error -1 ffffffff
Имеющий уши, да услышит.. (с) Новый Завет От Матфея святое благовествование

caa2000
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 14.05.2009 (Чт) 4:50

Re: GetObject в MDI Form

Сообщение caa2000 » 04.05.2021 (Вт) 2:53

Ok
Делаю ListView, но очень хочется узнать об ошибке в WebBrowser.
Если кто знает, подскажите, плз
Имеющий уши, да услышит.. (с) Новый Завет От Матфея святое благовествование


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 56

    TopList