![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как открывать любые приложения (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]Нельзя :-)