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