본문 바로가기

Delphi/꿀팁

외부 프로그램을 내 폼 안에 넣기

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;
반응형