어디서 보니까 SetParent(); 로 핸들을 넘겨주니까
새로띄우는 프로그램이 Parent 창에 쏙 들어가더라구요...
(델파이는 아닌것 같어용...)
// 실행시키고
ShellExecute(Handle,
'open', // open
'IQM.EXE', // program file
cc, // Parameters
Pchar(path), // default directory
SW_SHOWNORMAL);
// 핸들찾아서
wndIQM := findwindow('IQM',nil);
// 델파이로 핸들 넘겨준다.
Windows.SetParent(wndIQM,Handle);
이렇게 했는데 자꾸만 따로 떠서리 혼자 돌아다니더라구요...
Findwindow 의 결과값이 핸들 맞나요?
0 이 나오는것 같은데...
뭐가 잘못된 건지 좀 알려주세요...
사용법이 잘못되었네요.
첫번째 파라메터에는 클래스명을 두번째에는 윈도우명을 적어줘야 하는데
findwindow('TForm1', 'Form1');
그리고 그 프로그램이 여러개 뜬다면 실행시킨 프로그램이 들어간다는 보장도 없을 듯 하네요. (기억이 맞다면 제일 처음에 뜬 실행화일의 핸들을 리턴할겁니다.)
예전에 다른분이 짜놓은 코드가 있길래 첨부합니다.
이건 익스플로러네요.
즐프하세용 ^-^
function WinExecEx(FileName: string; Visibility: Integer): DWORD;
var
zAppName: array[0..512] of char;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
Result := 0;
StrPCopy(zAppName, FileName);
FillChar(StartupInfo, Sizeof(TStartupInfo), #0);
with StartupInfo do
begin
cb := Sizeof(TStartupInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := Visibility;
end;
if not CreateProcess(nil, zAppName, nil, nil, False, NORMAL_PRIORITY_CLASS,
nil, nil, StartupInfo, ProcessInfo) then RaiseLastWin32Error
else
begin
WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
Result := ProcessInfo.dwThreadId;
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
end;
function EnumThreadWindowsProc(hWnd: HWND; var Param: HWND): BOOL; stdcall;
begin
Result := True;
if (GetWindowLong(hWnd, GWL_HWNDPARENT) = 0) and (IsWindowVisible(hWnd) or
IsIconic(hWnd)) and ((GetWindowLong(hWnd, GWL_EXSTYLE) and (WS_EX_WINDOWEDGE
or
WS_EX_APPWINDOW)) <> 0) then
begin
Param := hWnd;
Result := False;
end;
end;
function WindowFromThreadId(AThreadId: DWORD): HWND;
begin
Result := 0;
EnumThreadWindows(AThreadId, @EnumThreadWindowsProc, HWND(@Result));
end;
procedure TMainForm.btnStartClick(Sender: TObject);
var
hWnd: Windows.HWND;
begin
IEThreadId := WinExecEx('C:Program FilesInternet ExplorerIEXPLORE.EXE',
SW_MINIMIZE);
Sleep(500);
hWnd := WindowFromThreadId(IEThreadId);
if hWnd > 0 then
begin
Windows.SetParent(hWnd, Handle);
SetWindowPos(hWnd, 0, 0, 0, ClientWidth, ClientHeight, SWP_NOZORDER or
SWP_SHOWWINDOW);
end;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
PostThreadMessage(IEThreadId, WM_CLOSE, 0, 0);
//메인폼이 닫힐때 같이 닫는다.
end;