Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как открывать любые приложения (Win32) в окне моего приложения? [D6, Win2k]


Yr2 ©   (2002-12-02 14:46:00) 

Можно ли принципиально любые приложения (Win32) открывать в окне моего приложения? То есть как бы глобально "перенаправить" desktop Wundows в окно (форму) моей программы?


BIN   (2002-12-05 08:19:00) [1]

2 mukha
а что за глюки ??? вроде нормально перетаскивается и калькулятор и форма???


Yr2   (2002-12-04 22:07:00) [2]

To mukha
Так в моем примере ж то же самое!


mukha   (2002-12-04 21:59:00) [3]

Вот пример запуска калькулятора в окне приложения, но опять же есть глюки, например, при перетаскивании за заголовок.
procedure TForm1.Button1Click(Sender: TObject);
var
Window : HWND;
begin
WinExec("calc.exe", SW_SHOWNORMAL);
Window := FindWindow("SciCalc", nil);
if Window <> 0 then
Windows.SetParent(Window, Handle);
end;


Yr2   (2002-12-04 21:56:00) [4]

Ладно, рассказываю сказочку про моего белого бычка.
Было написано 3 десятка COM-объектов, выполняющих определенные простые действия с БД (Oracle). Каждый объект - это форма с набором кнопок (инструментарий). COM-объекты оформлены не в виде DLL, а в виде EXE-файлов. То есть, каждый такой exe-ник можно "просто запустить" и работать как с любой программой, а можно использовать его по правилам доступа через COM-интерфейс. Не хотелось изучать этот интерфейс и делать свою программу вызова COM-объектов. Хотелось по-простому позапускать их из одной проги с возможностью легкого переключения между формами и все. На сегодняшний день этот вариант работает. Но и "честный" вариант (через интерфейсы) тоже пришлось изучить и сделать второй вариант...


JohnnyJ   (2002-12-04 17:22:00) [5]


> Ole Automation


VMWare Workstation %))))

P.S. Прошу прощения, за то что вмешиваюсь в серьезный разговор, но просто очень удачная рифма, не смог удержаться.


NailS   (2002-12-04 12:36:00) [6]


> Yr2 © (02.12.02 15:58)
> Грустно... Хорошо, попробую сузить задачу. Можно ли в окне
> моего "материнского" приложения открывать другие приложения
> (запускать exe-файлы), написанные же мною?

Ole Automation?


msts   (2002-12-04 12:20:00) [7]

перехвати вызов GetDesktopWindow
возвати хвнд своего окна может что получится


Игорь Шевченко   (2002-12-04 09:42:00) [8]

Yr2 © (03.12.02 23:33)

А что за нужда в запуске "однооконных приложений, написанных несколькими разработчиками (исходников нет) на Delphi."

Может, можно найти иной способ ?


Yr2   (2002-12-03 23:33:00) [9]

Ребята, насчет "принципиально любые приложения" это я действительно "загнул", потому как думал, вдруг кто-нибудь знает общий подход. На самом деле мне действительно надо запускать однооконные приложения, написанные несколькими разработчиками (исходников нет) на Delphi. Это не игры с DirectX...
Только нужно было это сделать из меню одной "материнской" программы с отображением в окне её же.
Спасибо всем за посильное участие.


Anatoly Podgoretsky   (2002-12-03 23:21:00) [10]

И для интереса, пусть попробует для начало запустить какую нибудь игру с ДиректИкс


Юрий Зотов   (2002-12-03 23:10:00) [11]

Без Петцольда все же не получится.

Трюк с SetParent стар, как мир и для некоторых однооконных приложений приложений действительно может сработать (правда с кучей глюков, на которые Вы еще натолкнетесь, если уже не натолкнулись). Но Вы же хотели открывать в своем окне "принципиально любые приложения"?

Вот и попробуйте. А потом вспомните Петцольда.


Yr2   (2002-12-03 21:42:00) [12]

Я всё-таки достиг положительных результатов. Сделать это можно следующим образом:
кидаете на форму кнопку Button1 и Panel1, в которой будет имитироваться наш "десктоп". По нажатию на кнопку запускается процедура Button1Click. Заданное приложение (exe-файл) запускается и отображается только в рамках панели Panel1.


Procedure TForm1.Button1Click(Sender: TObject);

VAR h : THANDLE;

begin
WinExec("C:\Program Files\Windows NT\Accessories\ImageVue\kodakimg.exe", SW_HIDE);
// или WinExec("C:\Program Files\Adobe\Acrobat 4.0\Reader\AcroRd32.exe, SW_HIDE);

h:=FindWindow(nil, "Imaging");
// или h:=FindWindow(nil, "Acrobat Reader");


if h <> 0 then begin
ShowMessage("OK!");
windows.SetParent(h, Panel1.handle);
ShowWindow(h, SW_SHOWMAXIMIZED);
end;
end;


Попробовал несколько приложений. Работает. Без Петцольда.


Игорь Шевченко   (2002-12-02 18:39:00) [13]

Сама Windows этого не делает.


> изначально Вас уважаю как специалиста и благодарен уже только
> за то, что Вы единственный, кто откликнулся. Но, Ваш ответ
> напоминает Эллочку-Людоедку из общеизвестного фильма, которая
> знала только 30 слов...


Я и 30-то не знаю :-)

Лекцию об устройстве Windows читать ? Не буду. Если очень хочется, то можно почитать книги Петцольда, Рихтера и иже с ними.
На преподавание, к сожалению, нет ни времени, ни сил.

С уважением,


Yr2   (2002-12-02 16:47:00) [14]

Игорь, я, конечно, изначально Вас уважаю как специалиста и благодарен уже только за то, что Вы единственный, кто откликнулся. Но, Ваш ответ напоминает Эллочку-Людоедку из общеизвестного фильма, которая знала только 30 слов... А нельзя ли расширить ответ? То есть рассказать подробнее. Ведь сама Windows это "как-то" делает!?


Игорь Шевченко   (2002-12-02 16:06:00) [15]

Нельзя :-)


Yr2   (2002-12-02 15:58:00) [16]

Грустно... Хорошо, попробую сузить задачу. Можно ли в окне моего "материнского" приложения открывать другие приложения (запускать exe-файлы), написанные же мною? То есть это не MDI-приложение, не простые формы, не потоки... Это - новые процессы Windows.
Если да, то что для этого нужно учесть?


Игорь Шевченко   (2002-12-02 15:23:00) [17]

Нельзя :-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо