var
hSrcHandle: THandle;
hDstHandle: THandle;
function EnumWindowProc(hWindow: HWND; lParam: LPARAM): Boolean; stdcall;
Var
WndText: string;
begin
Result := True;
//화면에 보이는 프로그램으로 넣어야 하므로 작업표시줄에 보이지 않으면 제외
if not IsWindowVisible(hWindow) then
Exit;
SetLength(WndText, MAX_PATH);
//Caption/Title명으로 프로그램 체크
if GetWindowText(hWindow, PChar(WndText), MAX_PATH) > 0 then begin
if Pos('메모장', WndText) > 0 then
hSrcHandle := hWindow;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//Panel1의 핸들을 가져와서 패널 안에 넣기
hDstHandle := Panel1.Handle;
//다양한 방법으로 필요한 프로그램의 핸들을 가져옵니다.
EnumWindows(Addr(EnumWindowProc), 0);
//외부 프로그램의 부모를 Panel1으로 바꿉니다.
Winapi.Windows.SetParent(hSrcHandle, hDstHandle);
//프로그램의 크기와 Visible 변경
FormResize;
ShowWindow(hSrcHandle, SW_SHOW);
ShowWindow(hSrcHandle, SW_SHOW);
end;
procedure TForm1.pnlMainResize(Sender: TObject);
begin
if (hSrcHandle <> 0) then
SetWindowPos(hSrcHandle, 0, 0, 0, Panel1.Width, Panel1.Height, SWP_ASYNCWINDOWPOS);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//프로그램이 종료되면 외부 프로그램도 종료
if (hSrcHandle <> 0) then begin
PostMessage(hSrcHandle, WM_Close, 0, 0);
hSrcHandle := 0;
end;
end;
반응형