2010. június 23., szerda

Display the window of another application in a Delphi form


Problem/Question/Abstract:

I would like to have an application (f.e. notepad.exe) to run in a specified frame (TPanel,..) within my application.

Answer:

It does not work well but you can try this:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, StdCtrls, Menus, AppEvnts;

type
  TForm1 = class(TForm)
    ApplicationEvents1: TApplicationEvents;
    procedure FormCreate(Sender: TObject);
    procedure ApplicationEvents1Activate(Sender: TObject);
  private
    { Private declarations }
    FNotepad: HWND;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  wnd: HWND;
  tries: Integer;
begin
  WinExec('notepad.exe', SW_HIDE);
  tries := 0;
  repeat
    wnd := Findwindow('notepad', nil);
    if wnd = 0 then
    begin
      inc(tries);
      sleep(100);
    end;
  until
    (wnd <> 0) or (tries > 10);
  if wnd <> 0 then
  begin
    windows.setparent(wnd, handle);
    application.title := 'Notepad';
    MoveWindow(wnd, 0, 0, clientwidth, clientheight, false);
    ShowWindow(wnd, SW_SHOW);
    SetForegroundWindow(wnd);
    FNotepad := wnd;
  end
  else
    showmessage('Failed');
end;

procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
begin
  if IsWindow(FNotepad) then
    SetForegroundWindow(FNotepad)
  else
    Close;
end;

end.

To wire the notepad window to a panel you would simlpy use the panels handle in the SetParent call.

Nincsenek megjegyzések:

Megjegyzés küldése