Вікно у вікні

Хочу запускати інші програми (через OpenDialog) у своєму вікні, як це зробити не використовую заголовок вікна, а використовуючи наприклад ShellExecuteEx або CreateProcess, що то у ченя не вдалося використовувати хендл, що повертається, вставляючи його в Windows.SetParent, з ShellExecuteEx брав.

ShellExecuteEx і CreateProcess не дають хендлВІКНА. Вони дають зовсім інші хендли, які для SetParent не годяться.

Використовуйте CreateProcess+WaitForInputIdle+пошук_вікна. Не обов'язково шукати вікно за заголовком, через EnumThreadWindows буде швидше.

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

Все працює, тільки як зробити так щоб програма, що відкривається, не була видна в згорнутому вигляді на Desktop'е? (Щоб вона згорталася і залишалася в моєму вікні, а то вона не згортається)

вже зовсім не знаю про xyv ти говориш але думаю setwindowlong+gwl_style вирішить всі твої проблеми

Як дізнатися lpClassName програми, що запускається?

>Proton Не котить. прога запускається як незалежний додаток правда у моєму вікні, і при закритті моєї програми воно залишається =(

В принципі варіант Proton'a працює якщо запускати програми не написані на Delphi, тоді вони відкриваються тільки в моєму вікні, а якщо програма написана на Delphi, то вона відкривається в моєму вікні, але якніби окрема програма (вона є в мінімізованому вигляді біля моєї програми) і при закритті моєї програми вона залишається. Можливо це пов'язано з тим, що вони мають однакове ім'я класу?

Показати чуже вікно всередині свого можна, і навіть легко. Але запустити чужу ПРОГРАМУ всередині своєї не можна, вона все одно залишиться окремим процесом. Хоч на Delphi вона написана, хоч ні – це не має значення.

>Юрій Зотов Поясни мені різницю, чому якщо я запускаю :

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 stdcall; ; export; 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 іf 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"а. Може підкажеш якийсь інший варіант? Завдання у мене є меню в якому я вибираю компілятор, там же задаю ключі для запуску, а потім при натисканні на кнопку, викликаю зовнішній компілятор у своєму вікно.