Embed an application (exe file) into another exe file (mozEmbed like)

后端 未结 4 1508
悲&欢浪女
悲&欢浪女 2021-02-10 03:18

I would like to embed mozilla firefox into my application WITHOUT using any activex control (TWebBrowser wrapper, mozilla ActiveX...). I tried using TWebBrowser (actually bsalsa

4条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-02-10 03:39

    You'll need to clean up the code a bit and work out how you'll "talk" to Firefox.
    But here is how you can embed any app inside a Delphi form.

    DFM File

    object frmMain: TfrmMain
      Left = 195
      Top = 154
      Width = 527
      Height = 363
      Caption = 'Containership Test'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      DesignSize = (
        519
        329)
      PixelsPerInch = 96
      TextHeight = 13
      object pnlTop: TPanel
        Left = 0
        Top = 0
        Width = 519
        Height = 292
        Align = alTop
        Anchors = [akLeft, akTop, akRight, akBottom]
        BevelInner = bvLowered
        TabOrder = 0
      end
      object btnLoadApp: TButton
        Left = 172
        Top = 297
        Width = 75
        Height = 25
        Anchors = [akLeft, akBottom]
        Caption = 'Load'
        TabOrder = 1
        OnClick = btnLoadAppClick
      end
      object btnKill: TButton
        Left = 260
        Top = 297
        Width = 75
        Height = 25
        Anchors = [akLeft, akBottom]
        Caption = 'Kill'
        TabOrder = 2
        OnClick = btnKillClick
      end
    end
    

    main.pas file

    unit main;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, ShellApi;
    
    type
      TfrmMain = class(TForm)
        pnlTop: TPanel;
        btnLoadApp: TButton;
        btnKill: TButton;
        procedure btnLoadAppClick(Sender: TObject);
        procedure btnKillClick(Sender: TObject);
      private
        { Private declarations }
        AppWnd : DWORD;
      public
        { Public declarations }
      end;
    
    var
      frmMain: TfrmMain;
    
    implementation
    
    {$R *.dfm}
    
    procedure TfrmMain.btnLoadAppClick(Sender: TObject);
    var
      ExecuteFile : string;
      SEInfo: TShellExecuteInfo;
    begin
      ExecuteFile:='c:\Windows\notepad.exe';
    
      FillChar(SEInfo, SizeOf(SEInfo), 0) ;
      SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
      with SEInfo do
      begin
        fMask := SEE_MASK_NOCLOSEPROCESS;
        Wnd := pnlTop.Handle;
        lpFile := PChar(ExecuteFile) ;
        nShow := SW_HIDE;
      end;
      if ShellExecuteEx(@SEInfo) then
      begin
        AppWnd := FindWindow(nil, PChar('Untitled - Notepad'));
        if AppWnd <> 0 then
        begin
          Windows.SetParent(AppWnd, SEInfo.Wnd);
          ShowWindow(AppWnd, SW_SHOWMAXIMIZED);
          ShowWindow(AppWnd, SW_SHOWMAXIMIZED);
        end;
      end
      else
        ShowMessage('Error starting notepad!') ;
    end;
    
    procedure TfrmMain.btnKillClick(Sender: TObject);
    begin
      if (AppWnd <> 0) then
      begin
        PostMessage(AppWnd, WM_Close, 0, 0);
        AppWnd := 0;
      end;
    end;
    
    end.
    

提交回复
热议问题