Текущий архив: 2002.10.14;
Скачать: CL | DM;
Вниз
Окно в окне... Найти похожие ветки
← →
МИФИст © (2002-07-28 23:21) [0]Хочу запускать другие программы (через OpenDialog) в своём окне, как это сделать не использую заголовок окна, а используя например ShellExecuteEx или CreateProcess, что то у ченя не получилось использовать возвращаемый хэндл, вставляя его в Windows.SetParent, из ShellExecuteEx брал hInstApp...
← →
Юрий Зотов © (2002-07-29 00:10) [1]ShellExecuteEx и CreateProcess не дают хэндл ОКНА.
Они дают совсем другие хэндлы, которые для SetParent не годятся.
Используйте CreateProcess + WaitForInputIdle + поиск_окна.
Не обязательно искать окно по заголовку, через EnumThreadWindows будет быстрее.
← →
Proton © (2002-07-29 13:47) [2]2Юрий Зотов
не подумайте что содрал т.к. это я писал пару недель назад в этом форуме
в качестве ответа на схожий вопрос
2МИФИст
function EnumWindowsProc(hWindow : hWnd;
lParam : LongInt) : Bool
{$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
begin
Result := True;
if IsWindowVisible(hWindow) then
begin
SetWindowText(hWindow,"test");
result := false;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var si:STARTUPINFO;
pi:PROCESS_INFORMATION;
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
CreateProcess(nil,
"notepad.exe"
,nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,si,pi);
CloseHandle(Pi.hThread);
WaitForInputIdle(pi.hProcess,INFINITE);
CloseHandle(Pi.hProcess);
EnumThreadWindows(pi.dwThreadId,@EnumWindowsProc,0);
end;
---
только вместо setwindowtext используй setparent
← →
МИФИст © (2002-07-30 22:52) [3]Всё работает, только как сделать так чтобы открываемая программа не была видна в свёрнутом виде на Desktop"е? (Чтобы она сворачивалась и оставалась в моём окне, а то она не сворачивается)
← →
Proton © (2002-07-31 02:37) [4]уж совсем не знаю о xyv ты говориш
но думаю
setwindowlong+gwl_style
рашит все твои проблеммы
← →
МИФИст © (2002-08-01 22:05) [5]Как узнать lpClassName запускаемого приложения?
>Proton
Не катит...прога запускается как независимое приложение правда в моём окне, и при закрытии моей программы оно остаётся =(
← →
МИФИст © (2002-08-02 13:59) [6]В принципе вариант Proton"a работает если запускать програмы не написанные на Delphi, тогда они открываются только в моём окне, а если программа написана на Delphi, то она открывается моём окне, но как будто отдельная программа (она имеется в минимизированном виде, возле моей программы) и при закрытии моей программы она остаётся. Может быть это связанно с тем что у них одинаковое имя класса?
← →
Юрий Зотов © (2002-08-05 23:41) [7]> МИФИст
Показать чужое ОКНО внутри своего можно, и даже легко. Но запустить чужую ПРОГРАММУ внутри своей нельзя, она все равно останется отдельным процессом. Хоть на Delphi она написана, хоть нет - это неважно.
← →
МИФИст © (2002-08-06 12:36) [8]>Юрий Зотов
Обьясни мне разницу, почему если я запускаю :
var
Window : HWND;
begin
WinExec("calc.exe", SW_SHOWNORMAL);
Window := FindWindow("SciCalc", nil);
if Window <> 0 then
Windows.SetParent(Window, Handle);
то калькулятор оказывается полность в моём окне и там же сворачивается, а если же я запускаю другую программу:
var
Form1: TForm1;
Compiler: PChar = nil;
function EnumWindowsProc(hWindow : hWnd;
lParam : LongInt) : Bool
{$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
var lpRect: TRect;
begin
Result := True;
if IsWindowVisible(hWindow) then
begin
Windows.SetParent(hWindow,Form1.Panel1.Handle);
result := false;
end;
end;
procedure TForm1.SpeedButton4Click(Sender: TObject);
var si:STARTUPINFO;
pi:PROCESS_INFORMATION;
begin
if Compiler=nil then
begin
ShowMessage("You must select compiler first");
Exit;
end;
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
CreateProcess(nil,Compiler,nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,si,pi);
CloseHandle(Pi.hThread);
WaitForInputIdle(pi.hProcess,INFINITE);
CloseHandle(Pi.hProcess);
EnumThreadWindows(pi.dwThreadId,@EnumWindowsProc,0);
end;
то либо она открывается в моём окне как надо (если это тот же калькулятор), либо выбивает куда-то нижнюю панель DeskTop"а, так, что вернуть её можно только перезагрузкой Explorer"а.
Может подскажешь какой-нибудь другой вариант?
Задача у меня есть меню в котором я выбираю компилятор, там же задаю ключи для запуска, а потом при нажатии на кнопку, вызываю внешний компилятор в своем окне.
Страницы: 1 вся ветка
Текущий архив: 2002.10.14;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.032 c