panel内嵌程序窗体

function RunAppInPanel(const AppFileName: string; ParentHandle: HWND; var WinHandle: HWND): Boolean;
var
  si: STARTUPINFO;
  pi: TProcessInformation;
begin
  Result := False;

  // 启动进程
  FillChar(si, SizeOf(si), 0);
  si.cb := SizeOf(si);
  si.wShowWindow := SW_SHOW;
  if not CreateProcess(nil, PChar(AppFileName), nil, nil, true,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then Exit;

  // 等待进程启动
  WaitForInputIdle(pi.hProcess, 10000);

  // 取得进程的 Handle
  WinHandle := GetProcessWindow(pi.dwProcessID);
  if WinHandle > 0 then begin
    // 设定父窗体
    Windows.SetParent(WinHandle, ParentHandle);

    // 设定窗体位置
    SetWindowPos(WinHandle, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOZORDER);

    // 去掉标题栏
    SetWindowLong(WinHandle, GWL_STYLE, GetWindowLong(WinHandle, GWL_STYLE)
      and (not WS_CAPTION) and (not WS_BORDER) and (not WS_THICKFRAME));

    Result := True;
  end;

  // 释放 Handle
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
end;

//var hWin: HWND = 0;
//FormClose
//  if hWin > 0 then PostMessage(hWin, WM_CLOSE, 0, 0);
//FormResize
//  if hWin <> 0 then MoveWindow(hWin, 0, 0, panel1.ClientWidth, panel1.ClientHeight, True);

//if not RunAppInPanel(App, panel1.Handle, hWin) then ShowMessage('App not found');
原文地址:https://www.cnblogs.com/MaxWoods/p/3710446.html