Окно стороннего приложения внутри VB-формы

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

Окно стороннего приложения внутри VB-формы

Сообщение Petroid » 20.08.2007 (Пн) 22:51

Помогите несмышленышу.
Как сделать так, чтобы окно другого приложения, скажем Exсel размещалось внутри созданной VB-формы. Без всяких там OLE. Просто надо чтобы окно, в том виде, как мы видим его обычно (с тулбарами, полосами прокрутки и т.д.) не выходило за пределы созданной формы.

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 21.08.2007 (Вт) 0:02

Использовать WinAPI-функцию SetParent


Пример. Помещение окна блокнота в окно нашей программы.

1. Создаем новый проект Standart EXE
2. Вписываем этот код в код формы:
Код: Выделить всё
Private Sub Form_Load()

    Shell "notepad.exe", vbNormalNoFocus

    N = FindWindow("Notepad", vbNullString)

    Call SetWindowPos(N, 0, 0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY, &H10)

    Call SetParent(N, Me.hWnd)

End Sub


3. Создаем модуль.
4. Вписываем в него этот код:
Код: Выделить всё
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long


Запускаем.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 21.08.2007 (Вт) 10:51

Использовать WinAPI-функцию SetParent
Ну-ну. Попробуй-ка эксель СетПарентом вогнать к себе на форму. Что ты видишь? Для эксперементов можно воспользоваться моим WnDViewer'ом - http://twister.orgfree.com/projects
А я все практикую лечение травами...

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 21.08.2007 (Вт) 12:03

Twister писал(а):
Использовать WinAPI-функцию SetParent
Ну-ну. Попробуй-ка эксель СетПарентом вогнать к себе на форму. Что ты видишь?


Вижу тоже самое что и в случае с блокнотом:
Вложения
XLMAIN.jpg
SetParent и Excel
XLMAIN.jpg (99.4 Кб) Просмотров: 360

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 22.08.2007 (Ср) 10:42

Гм... Виста...
Я исхожу из того, что может быть конфликт адресов, или другая лабуда. Мы же, все-таки, тянем окно из чужого приложения. Достаточно переместить часики из трея к себе на форму и увидеть, как синий цвет (в случае с ХР) теряется и часики становятся черными. Вообщем, я бы этот способ не рекомендовал.
А я все практикую лечение травами...

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

Сообщение Хакер » 22.08.2007 (Ср) 11:30

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


Конфликт каких адресов? Онко при изменении парента не теряет привызки к процессу и потоку.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 22.08.2007 (Ср) 12:13

Конфликт каких адресов? Онко при изменении парента не теряет привызки к процессу и потоку.
Это ты мне рассказываешь? :wink: В теории должно быть все гладко. Но не известно, как поведет себя конкретное окно в общем случае со всеми хуками, сабклассами и т.д. Повторюсь - перекинь часики из трея к себе на форму и понаблюдай за цветом. Это не конфликт адресов, а конфликт чего-то другого (влом садиться за отладчик и смотреть)...
А я все практикую лечение травами...

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

Сообщение Хакер » 22.08.2007 (Ср) 12:19

Это ты мне рассказываешь? :wink:

От такого вопроса я даже засомневался, а действительно ли это я? :roll:

Но не известно, как поведет себя конкретное окно в общем случае со всеми хуками, сабклассами и т.д. Повторюсь - перекинь часики из трея к себе на форму и понаблюдай за цветом. Это не конфликт адресов, а конфликт чего-то другого (влом садиться за отладчик и смотреть)...

Это не удивительно, потому что писали это с уверенностью, что никому не придёт в голову заниматься подобным. Поэтому, возможно, применили какой-то блэкмагик.

Но не известно, как поведет себя конкретное окно в общем случае со всеми хуками, сабклассами и т.д.


Если это окно в юзерском понимании (а в юзерском понимании это такая рамочка, с синей полосочкой и кнопочками. Кнопка в их понимании - не окно), т.е. оно без стиля WS_CHILDWINDOW, то с вероятностью в 90% всё будет работать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 22.08.2007 (Ср) 12:22

то с вероятностью в 90% всё будет работать
Вот-вот. А остальные 10 процентов могут предложить отправить отчет об ошибке к такой-то матери... И кому такое приложение будет нужно?
А я все практикую лечение травами...

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

Сообщение Хакер » 22.08.2007 (Ср) 12:25

Нет, отчёта об ошибке быть не должно. Откуда ему взяться?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Petroid
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 20.08.2007 (Пн) 22:36

Сообщение Petroid » 22.08.2007 (Ср) 12:36

Я извиняюсь, но объясните, как недалёкому, как это сделать. Я в вышеуказанном примере вместо Notepad подставил путь к Excel и Word, но олкна приложения открываются вне VB-формы, в то время как в случае с Notepad окно открывается там, где надо.

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

Сообщение Хакер » 22.08.2007 (Ср) 12:39

Я в вышеуказанном примере вместо Notepad подставил путь к Excel и Word

Мало в этой строчке менять путь:
Код: Выделить всё
Shell "notepad.exe", vbNormalNoFocus


Нужно ещё в этой строчке менять класс окна.
Код: Выделить всё
N = FindWindow("Notepad", vbNullString)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 22.08.2007 (Ср) 15:38

Узнать класс интересующего тебя окна можно, например, при помощи этой утилиты.
Вложения
winlooker.rar
(11.9 Кб) Скачиваний: 55
Последний раз редактировалось t116 22.08.2007 (Ср) 16:39, всего редактировалось 1 раз.

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

Сообщение Хакер » 22.08.2007 (Ср) 16:04

Мерзость. Мезрость потому что за названием спай плюс (косящим под Spy++ (великолепная утилита от Microsoft) ) скрывается какая-то поделка с до боли знакомым "ВуБиндом" в названии и бестолковой формой, сжирающей много рабочего пространства.
Последний раз редактировалось Хакер 22.08.2007 (Ср) 16:09, всего редактировалось 1 раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.08.2007 (Ср) 16:09

А у меня есть Spy-без-плюсов, из Win31 SDK.
Бе-бе-бе :tongue:
Изображение

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 22.08.2007 (Ср) 16:43

Какое первое слово в голову взбрело, так и назвал :)
И делал я эту утилиту 10 минут.

PS. Название изменил, только не бейте!

Petroid
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 20.08.2007 (Пн) 22:36

Сообщение Petroid » 24.08.2007 (Пт) 22:31

Последний (опятьб же глупый) вопрос.
А как обращаться из VB к этому окну. Скажем, как получить данные из одной из ячеек, находящихся внутри длочернего окна Excel.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.08.2007 (Сб) 6:35

А как обращаться из VB к этому окну. Скажем, как получить данные из одной из ячеек, находящихся внутри длочернего окна Excel
Да блин. Говорили с самого начала - надо OLE использовать, а то налепить ексель-то налепили на форму, а как общаться не знаем.

Как вариант - создать экземпляр экселя через CreateObject, найти его окно, налепить на форму и общаться стандартным способом. Но не знаю, прокатит ли это после такого изврата с окном.
А я все практикую лечение травами...


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 23

    TopList  
cron