Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.16;
Скачать: CL | DM;

Вниз

Как открывать любые приложения (Win32) в окне моего приложения?   Найти похожие ветки 

 
Yr2 ©   (2002-12-02 14:46) [0]

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


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

Нельзя :-)


 
Yr2 ©   (2002-12-02 15:58) [2]

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


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

Нельзя :-)


 
Yr2 ©   (2002-12-02 16:47) [4]

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


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

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


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


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

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

С уважением,


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

Я всё-таки достиг положительных результатов. Сделать это можно следующим образом:
кидаете на форму кнопку 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-03 23:10) [7]

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

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

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


 
Anatoly Podgoretsky ©   (2002-12-03 23:21) [8]

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


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

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


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

Yr2 © (03.12.02 23:33)

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

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


 
msts   (2002-12-04 12:20) [11]

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


 
NailS ©   (2002-12-04 12:36) [12]


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

Ole Automation?


 
JohnnyJ ©   (2002-12-04 17:22) [13]


> Ole Automation


VMWare Workstation %))))

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


 
Yr2 ©   (2002-12-04 21:56) [14]

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


 
mukha ©   (2002-12-04 21:59) [15]

Вот пример запуска калькулятора в окне приложения, но опять же есть глюки, например, при перетаскивании за заголовок.
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 22:07) [16]

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


 
BIN ©   (2002-12-05 08:19) [17]

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



Страницы: 1 вся ветка

Текущий архив: 2002.12.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
3-51639
Jurden
2002-11-28 15:51
2002.12.16
Пробелы в стринговом поле


14-51965
VictorT
2002-11-26 21:56
2002.12.16
Предзагрузка - хорошо или плохо?


3-51572
Dbrf
2002-11-27 10:41
2002.12.16
Нумерация записей


3-51569
Воропай Андрей
2002-11-25 11:57
2002.12.16
Повторный запуск клиентского приложения не происходит


1-51771
^Sanya
2002-12-04 00:00
2002.12.16
Кто найдёт ошибку(ки) в этом коде?