AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Fremdes Programm in eigenem Programm steuern in Bezug auf die Größe.
Thema durchsuchen
Ansicht
Themen-Optionen

Fremdes Programm in eigenem Programm steuern in Bezug auf die Größe.

Ein Thema von Piro · begonnen am 10. Apr 2011 · letzter Beitrag vom 18. Apr 2011
Antwort Antwort
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

Fremdes Programm in eigenem Programm steuern in Bezug auf die Größe.

  Alt 10. Apr 2011, 20:25
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
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#2

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

  Alt 10. Apr 2011, 20:36
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.

Geändert von Matze (10. Apr 2011 um 20:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#3

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

  Alt 10. Apr 2011, 20:53
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.

Geändert von Piro (10. Apr 2011 um 20:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 10. Apr 2011, 20:59
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.
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#5

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

  Alt 18. Apr 2011, 09:13
** 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.

Geändert von Piro (18. Apr 2011 um 09:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 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