Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fremdes Programm in eigenem Programm steuern in Bezug auf die Größe. (https://www.delphipraxis.net/159734-fremdes-programm-eigenem-programm-steuern-bezug-auf-die-groesse.html)

Piro 10. Apr 2011 20:25

Fremdes Programm in eigenem Programm steuern in Bezug auf die Größe.
 
Ich habe jetzt fast das ganze Forum durchsucht aber leider keinen passen Beitrag gefunden. Leider komme ich nicht auf die Lösung.

Ich kappsel ein fremdes Programm und lasse es maximiert auf meinem Eigenen anzeigen. Wenn ich jetzt aber das eigene Programm maximiere, ändert sich die Größe des fremden Programmes nicht mit. Es soll immer die Größe meines Programmes habe, wenn die fremde Anwendung maximiert ist.

Ich habe einiges probiert aber nichts hat geklappt. Hier mein Code.
Delphi-Quellcode:
...
private
    { Private-Deklarationen }
    aWnd: hWnd; //Handle auf das Window welches man einsperren möchte
...
procedure Tfrm_main.FormActivate(Sender: TObject);
var
 AppName, AppExe : PAnsiChar;
begin
 AppName := 'notepad';
 AppExe := 'notepad.exe';

 //ext. Anwendung aufrufen...
 ShellExecute(0, 'open', AppExe, nil, nil, SW_HIDE);

 // fremde Anwendung in eigene Anwendung kappseln
 aWnd := FindWindow(AppName, nil);
 while aWnd = 0 do aWnd := FindWindow(AppName, nil); //Solange warten bis Programm gestartet wurde

 Windows.SetParent(aWnd, Panel1.Handle);
// SetWindowLong(aWnd,GWL_STYLE,GetWindowLong(aWnd,GWL_STYLE) and not WS_CAPTION); // Titelleiste ausblenden
 ShowWindow(aWnd, SW_MAXIMIZE);
end;

procedure Tfrm_main.FormResize(Sender: TObject);
begin
 ShowWindow(aWnd,SW_MAXIMIZE); // passiert nichts
 SetWindowPos(aWnd, 0, 0, 0, frm_main.Width, frm_main.Height, SWP_SHOWWINDOW); // ist schon fast maximiert, aber es fehlt die untere Scrollleiste.
end;
Danke im Voraus.
Sven

Matze 10. Apr 2011 20:36

AW: Fremdes Programm in eigenem Programm steuern in Bezug auf die Größe.
 
Hallo,

nicht schön gelöst, aber bei mir funktioniert's (Win XP):
Delphi-Quellcode:
procedure TForm1.FormResize(Sender: TObject);
begin
 ShowWindow(aWnd, SW_HIDE);
 ShowWindow(aWnd, SW_SHOWMAXIMIZED); // oder SW_MAXIMIZE
end;
Das nur, bevor du gar keine Lösung findest.

Edit: Hm, das geht nur, wenn du das Hauptfenster z.B. maximierst. Eine Größenänderung mit der Maus funktioniert dann nicht mehr. Auch müsstest du verhindern, dass sich die Sub-Anwendung minimieren lässt.

Piro 10. Apr 2011 20:53

AW: Fremdes Programm in eigenem Programm steuern in Bezug auf die Größe.
 
Danke dir.

Wenn man den "Maximieren-Button" klickt, wird die Form auch wieder maximiert. Super.

Leider aber kann ich das Hauptfenster mit Maus gar nicht mehr verändern. Woran liegt das? Kann man das vermeiden?

Kann man vielleicht was mit SendMessage machen? Das Handle des Fensters hätte ich.

Matze 10. Apr 2011 20:59

AW: Fremdes Programm in eigenem Programm steuern in Bezug auf die Größe.
 
Jupp, das habe ich vorhin oben ergänzt.
Wenn du ein OnResized-Ereignis definierst (wie hier beschrieben), dann funktioniert es halbwegs:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ShellAPI;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormActivate(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    aWnd: hWnd; //Handle auf das Window welches man einsperren möchte

    FResized: Boolean;
    FMaximized: Boolean;
    procedure WMSIZE(Var AMsg:TWMSize); message WM_SIZE;
    procedure WMEXITSIZEMOVE(Var AMsg:TMessage); message WM_EXITSIZEMOVE;

    procedure FormResized;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
var
  AppName, AppExe : PAnsiChar;
begin
  AppName := 'notepad';
  AppExe := 'notepad.exe';

  //ext. Anwendung aufrufen...
  ShellExecute(0, 'open', AppExe, nil, nil, SW_HIDE);

  // fremde Anwendung in eigene Anwendung kappseln
  aWnd := FindWindow(AppName, nil);
  while aWnd = 0 do aWnd := FindWindow(AppName, nil); //Solange warten bis Programm gestartet wurde

  Windows.SetParent(aWnd, Panel1.Handle);
  // SetWindowLong(aWnd,GWL_STYLE,GetWindowLong(aWnd,GWL_STYLE) and not WS_CAPTION); // Titelleiste ausblenden
  ShowWindow(aWnd, SW_MAXIMIZE);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FResized := false;
  FMaximized := (WindowState = wsMaximized);
end;

procedure TForm1.WMSIZE(var AMsg: TWMSize);
begin
  inherited;

  if (AMsg.SizeType = SIZE_RESTORED) and FMaximized then
  begin
    FormResized;
    FMaximized := false;
  end;

  if (AMsg.SizeType=SIZE_MAXIMIZED) then
  begin
    FormResized;
    FMaximized := true;
  end;
end;

procedure TForm1.WMEXITSIZEMOVE(var AMsg: TMessage);
begin
  inherited;
  FormResized;
end;

procedure TForm1.FormResized;
begin
  ShowWindow(aWnd, SW_HIDE);
  ShowWindow(aWnd, SW_MAXIMIZE);
end;

end.
Aber vielleicht gibt es schönere Lösungen.

Piro 18. Apr 2011 09:13

AW: Fremdes Programm in eigenem Programm steuern in Bezug auf die Größe.
 
** PUSH **

Die Lösung von Matze ist ok aber nicht wirklich die Lösung.

Gibt es eventuell noch eine besser?

Mir würde auch reichen, wenn die Anwendung immer maximiert ist und sich so an das Hauptfenster anpasst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz