unit MainForm;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.ExtCtrls,
Vcl.StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
Panel1: TPanel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Panel1Resize(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
FAppWnd: DWORD;
procedure PADoEmbeddApp(APanel: TPanel;
const AAppToExec, AParam:
string);
procedure PADoReleaseEmbeddedApp;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Winapi.ShellAPI;
procedure TForm1.PADoEmbeddApp(APanel: TPanel;
const AAppToExec, AParam:
string);
// App starten und einbetten
// uses Winapi.ShellAPI;
var
ExecuteFile:
string;
SEInfo: TShellExecuteInfo;
RetryCount: Integer;
begin
FillChar(SEInfo, SizeOf(SEInfo), 0);
SEInfo.cbSize := SizeOf(TShellExecuteInfo);
with SEInfo
do
begin
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := APanel.Handle;
lpFile := PChar(AAppToExec);
lpParameters := PChar(AParam);
nShow := SW_HIDE;
end;
if ShellExecuteEx(@SEInfo)
then // wenn Programm erfolgreich gestartet wurde
begin
RetryCount := 0;
repeat
FAppWnd := FindWindow(PChar('
HH Parent'),
nil);
Sleep(100);
Inc(RetryCount);
until (FAppWnd <> 0)
or (RetryCount > 10);
if FAppWnd <> 0
then // wenn das Fenster der ViewerApp gefunden wurde
begin
Winapi.Windows.SetParent(FAppWnd, SEInfo.Wnd);
SetWindowLong(FAppWnd, GWL_STYLE, GetWindowLong(
Handle, GWL_STYLE)
and not WS_BORDER
and not WS_THICKFRAME
and not WS_DLGFRAME
);
SetWindowPos(FAppWnd, 0, 0, 0, APanel.Width, APanel.Height, SWP_ASYNCWINDOWPOS);
Sleep(1000);
// das Gelbe vom Ei?
APanel.Repaint;
Application.ProcessMessages;
ShowWindow(FAppWnd, SW_SHOWMAXIMIZED);
end;
end;
end;
procedure TForm1.PADoReleaseEmbeddedApp;
// Eingebettetes Programm beenden
begin
if FAppWnd <> 0
then
begin
PostMessage(FAppWnd, WM_Close, 0, 0);
FAppWnd := 0;
end;
end;
procedure TForm1.Panel1Resize(Sender: TObject);
// Größe von Embedded App zusammen mit Fenster verändern
begin
if IsWindow(FAppWnd)
then
SetWindowPos(FAppWnd, 0, 0, 0, Panel1.Width, Panel1.Height, SWP_ASYNCWINDOWPOS);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PADoEmbeddApp(Panel1, '
hh.exe', '
R:\Example.chm');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
PADoReleaseEmbeddedApp;
end;
end.