Programm im Programm?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
NicoOD
Beiträge: 6
Registriert: Fr 8. Apr 2011, 08:38
OS, Lazarus, FPC: WinXP Prof. / Win2k (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit

Re: Programm im Programm?

Beitrag von NicoOD »

mschnell hat geschrieben:Auch wenn das u.U. mal wieder ziemlich Praxis-fremd ist: Die Sache mit dem Browser geht tatsächlich. Es muss dann lokal im Hintergrund ein Web-Server laufen und beide "Programme" müssen CGIs sein. Das "Äußere" ruft das "inneren" z.B. in einem iframe auf.
Die Idee ist auch nicht schlecht... ;-)
pluto hat geschrieben:Ich glaube das hat er meint. Aber kann man von Programm in Programm sprechen? Die Programme "Unterhalten" sich doch nur oder? Oder kann das zweite Programm auch im Ersten Programm angezeigt werden(Grafisch)?
Nein, so habe ich das nicht ganz gemeint.
Also, hier mal ein Update:
Ich habe mit dem folgenden Befehl (Dank Google-Suche und dem Hinweis von Bora4d) mit Delphi unter WinXP den Windows-Rechner in mein TPanel ("CapPanel") eingefangen (vorrausgesetzt, der Rechner ist geöffnet und heißt auch "Rechner"):

Code: Alles auswählen

windows.SetParent(findwindow(nil,PCHar('Rechner')),MainForm.CapPanel.Handle);
Ab da sind die Maße des Panels als "Bildschirmauflösung" für den Rechner (oder ein anderes externes Programm) gültig. Ich kann den Rechner auch nur noch im Panel bewegen. Wenn ich andere Exe-Dateien nehme, die einen Vollbildmodus haben, passen die sich an mein Panel an. Klappt super! (Geht übrigens auch mit dem ganzen Internet-Explorer, ist nur etwas klein...).

Jetzt muß ich das ganze nur noch Lazarus und meinem WinCE 5.0 beibringen. Dann bin ich in dieser Sache ja auch schon zufrieden... ;-)
Da ich aber gerade 'ne Zahn-OP hinter mir habe, war mir gerade nicht wirklich so danach...

Aber, es wird weitergehen...

Vielen Dank erstmal für Eure Hilfestellungen!!

Gruß -

Nico ;o)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Programm im Programm?

Beitrag von pluto »

Nicht schlecht. Wusste gar nicht, dass sowas überhaupt so einfach Möglich ist.

Theoretisch sollte das auch so unter Linux gehen. Ich teste das mal eben.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Programm im Programm?

Beitrag von pluto »

Ich habe diesen Link gefunden:
http://edn.embarcadero.com/article/27395" onclick="window.open(this.href);return false;

und daraus habe ich diese Unit gebastelt:

Code: Alles auswählen

unit unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  Buttons, LCLType, LCLProc, LCLIntf, gtk, xlib, gtk2, gdk, gpm, gtk2proc,x, libc;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
 function XFetchName(Display: PDisplay; W: TWindow; WindowNameReturn: PPChar): TStatus; cdecl;
 function XQueryTree(Display: PDisplay; W: TWindow; RootReturn: PWindow; ParentReturn: PWindow; _para5: PPWindow; NChildrenReturn: PCardinal): TStatus;
 
var
  Form1: TForm1; 
 
implementation
 
{ TForm1 }
 
{ FindWindow Function
 
  Derived from an original C source by Brian Paul. Released
  to public domain.
 
  Kylix Translation: Matthias Thoma
 
 
  Input:  dpy   - the X display
          scr   - the X screen number
          start - where to start search, usually root window
          name  - the window name to search for
}
 
 
function FindWindow(Display: PDisplay; Screen: Integer; Start: TWindow; Name: PChar): TWindow;
type
   AChildren = array[0..0] of TWindow;
   PChildren = ^AChildren;
 
var
  stat: TStatus;
  n: Integer;
  num: Cardinal;
  w: TWindow;
  root: TWindow;
  parent: TWindow;
  Children: PChildren;
  Title: PChar;
 
 
begin
   if (XFetchName(Display, Start, @Title) = 1) then
   begin
      if (strcmp(Name, Title )=0) then
      begin
         XFree(Title);
         Result := Start;
         Exit;
      end;
      XFree(Title);
   end;
 
   stat := XQueryTree(Display, start, @root, @parent, @children, @num);
 
   if (stat = 1) then
   begin
      { search each child window for a match: }
      for n := num-1 downto 0 do
      begin
         if (XFetchName(Display, start, @title )=1) then
         begin
            if (strcmp(name, title)=0) then
            begin
               { found it }
               XFree(Title);
               Result := Start;
               Exit;
            end;
            XFree(Title);
         end;
      end;
 
      { search the descendents of each child for a match: }
 
      for n := num-1 downto 0 do
      begin
         w := FindWindow(Display, Screen, Children^[n], Name);
         if (w <> 0) then
         begin
            XFree(Children);
            Result := w;
            Exit;
         end;
      end;
 
      if (children <> Nil) then
      begin
         XFree(Children);
      end;
   end;
 
   Result := 0;
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
//  FindWindow(,XDefaultScreen(QtDisplay),XDefaultRootWindow(QtDisplay),'Kylix') <> 0;
end;
 
initialization
  {$I unit1.lrs}
 
end.
Vielleicht möchte das ja jemand weiter verfolgen *G*... Kompiliert tut er das schon mal.
MFG
Michael Springwald

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Programm im Programm?

Beitrag von Bora4d »

NicoOD hat geschrieben: Also, das was Du da schreibst, Bora4d, klingt echt sehr interessant. Kannst Du mir da ein wenig unter die Arme greifen? Wenn man das fremde Programm (der Name ist beim Aufruf dann schon bekannt) in einem TPanel ablaufen lassen kann, wäre das DER Hit! So in der Art habe ich mir das auch vorgestellt...
Zuerst würde ich das dann auch in deiner Win32-Umgebung (WinXP) versuchen. Entweder mit Delphi, oder mit Lazarus.
Später kann man das ja immer noch versuchen auf WinCE zu übertragen.
Hast Du den Code davon noch? Ich möchte nicht alles abkupfern, nur mir Anregungen holen. Da geht das Lernen (bei mir) wesentlich schneller...
Ich könnte den ganzen Code geben aber habe nicht mehr. Ich hatte letzten Sommer meine Partition mit der ARbeit von 15 Jahren überschrieben weil ich mal wieder beschies..... Linux ausprobieren wollte.
Ich hatte herumprobiert wie Tabbed-Windowoberfläche aussehen würde. Ich hatte den Bildschirm in 3 Bereiche geteilt rechts und unten kleine Bereich wo Hilfsprogramme plaziert werden oben Links große Bereich wo Hauptprogramme erscheinen. Nun zu deinem Problem ich sehe du hast es schon einiges gelöst. Vielleicht helfen dir diese Sachen weiter:
1. Alle geöffneten Fensterhandles bekommst du mit Windows.EnumWindows. Wenn ein Fenster als Vorgänger (Parent) DesktopWindow hat und bei GWL_ExStyle-Eigenschaft die Attribute WS_EX_TOOLWINDOW nicht hat dann ist es Hauptfenster.
2. Wenn du ein bestimmtes Programm einbetten willst dan Starte es mit TProcess und bette danach ein. Weil ansonsten bekommst du nicht mit ob das Programm beendet wird. Und mit Timer zu kontrollieren ob das Programm noch läuft ist kein gute Lösung. Hier sind Beispiele für TProcess:
http://wiki.lazarus.freepascal.org/Exec ... rograms/de
Aber viel bessere Lösung ist das was Windows Task Leiste auch verwendet WH_SHELL Hook. Damit wird dein Programm automatisch über neu erstelltes und zerstörtes (PRogramm beenden) oder Fokusänderung.... von Fenster benachrichtigt. Und du Bekommst nur Handle von Hauptfenster.
Leider funktioneren die DLLs die mit Delphi erstellt werden indem Fall nicht. In dem Theme ist Internet ist voll mit Fragen von frustierten Delphi-Programmierern.
Ich habe auch nach Tagen erfolglose DLL erstellung bei Torry ein fertiges dll-gefungen. Packe hier als Anhang. Quelltext liegt bei vielleicht gelingt es dir mit mit Freepascal funktionierende dll zu erstellen. Der Junge hat auch aus dem Grunde nur dll mit C-Programmiert als andere in Delphi.
Da liegt auch ein Bespielspielprogramm dort kannst du z.b. jedes neues FEnster in dein Panel einbetten und wieder entfernen achte auf HSHELL_WINDOWCREATED, HSHELL_WINDOWDESTROYED Messages.

Edit:
Ob ShellHooks mit WinCE funktionieren weiß ich nicht deshalb würde ich erst in WinCE-Api danach gucken. Wenn du in windows.pas von WinCE die Funktion ShellProc und Message WH_SHELL findest mußte es funktionieren. Ich habe nie WinCE verwendet außer einmal zu schauen ob Lazarus wirklich WinCE programme erstellen kann. Also ein Paar Buttons kompilieren ausführen fertig :)

Edit2:
Vielleicht kennst du es auch aber bei Schweizer gibts gute tipps:
http://www.swissdelphicenter.ch/de/system.php
http://www.delphi-treff.de/tipps/system/

:idea: So ein Tipps&Tricks Pages wäre doch für Lazarus-Forum auch gut :lol:

Torry.net ist momentan down deshalb hast du die Biblothek hier:
Dateianhänge
wm_Shell_hook.rar
Shellhook.dll, Source+Examples von torry.net
(Freeware)
(57.29 KiB) 93-mal heruntergeladen

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Programm im Programm?

Beitrag von carli »

Bora4d hat geschrieben:Ich hatte letzten Sommer meine Partition mit der ARbeit von 15 Jahren überschrieben weil ich mal wieder beschies..... Linux ausprobieren wollte.
Geht vielen so ;)
Weil viele denken, die Festplatten im Computer heißen wirklich C:, D: und E:

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Programm im Programm?

Beitrag von mschnell »

Wenn man kein Backup hat darf man sich nicht wundern.

Zu Hause habe ich einen Linux-Server, auf dem alle Daten der Familie gespeichert werden. Stromvberbrauch gering Hardware ca. € 200: Software € 0. Dazu kommen natürlich Kabel und Switche.

Der macht automatisch in der Nacht ein Komplett-Backup auf eine USB-Platte (Software. Dirvish, € 0, Funbktionalität: genial, Bedienung (nach Installation): super einfach: Für jeden Tag gibt es ein Directory mit der kompletten Datei-Struktur, das auch man auf einem Windows-Rechner lesen kann).

Seit ein paar Wochen habe ich die USB-Backup-Platte mit einem alten "Slug" (Debian-Linux auf kleiner ARM-Hardware, Stromverbrauch und Kosten fast Null) in den Keller verlagert für den Fall, dass die Hütte abbrennt.

Linux macht's möglich.

-Michael

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Programm im Programm?

Beitrag von Bora4d »

Forbidden

You don't have permission to access /posting.php on this server.
..
Wird der Server von Linux betrieben :))
Das oben zeigt er wenn ich mein Original beitrag angebe.
Ich kenne mich schon mit Linux-system aus hatte Lustigen-Beitrag geschreiben aber das oben zeigt es an.

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Programm im Programm?

Beitrag von Bora4d »

mschnell hat geschrieben:Wenn man kein Backup hat darf man sich nicht wundern.

Zu Hause habe ich einen Linux-Server, auf dem alle Daten der Familie gespeichert werden. Stromvberbrauch gering Hardware ca. € 200: Software € 0. Dazu kommen natürlich Kabel und Switche.

Der macht automatisch in der Nacht ein Komplett-Backup auf eine USB-Platte (Software. Dirvish, € 0, Funbktionalität: genial, Bedienung (nach Installation): super einfach: Für jeden Tag gibt es ein Directory mit der kompletten Datei-Struktur, das auch man auf einem Windows-Rechner lesen kann).

Seit ein paar Wochen habe ich die USB-Backup-Platte mit einem alten "Slug" (Debian-Linux auf kleiner ARM-Hardware, Stromverbrauch und Kosten fast Null) in den Keller verlagert für den Fall, dass die Hütte abbrennt.

Linux macht's möglich.

-Michael
Pinguin-User benutzen für jeden Zweck ein eigenen PC mit speziellen Distro, Erfahrene Windof-User benutzen für alles ein PC mit ein BS ohne Datensicherung und VIrenscanner und es passiert 17 Jahre nichts schlimmes, es sei denn sie installieren NochEinDistroMitBesserenLogoWeilAlteLogoSchlechtAussah. :D

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Programm im Programm?

Beitrag von pluto »

Erfahrene Windof-User benutzen für alles ein PC
Sowas gibt es?

Letzten in der Zeitung habe ich von einem Fall gelesen: Dort war auf einem PC über 3000 verschiedene Viren drauf. *G*. Der PC wurde ohne Sicherheits Software betrieben.
Unter Linux brauche ich zum Glück sowas nicht...
MFG
Michael Springwald

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Programm im Programm?

Beitrag von Bora4d »

pluto hat geschrieben:
Erfahrene Windof-User benutzen für alles ein PC
Sowas gibt es?

Letzten in der Zeitung habe ich von einem Fall gelesen: Dort war auf einem PC über 3000 verschiedene Viren drauf. *G*. Der PC wurde ohne Sicherheits Software betrieben.
Unter Linux brauche ich zum Glück sowas nicht...
Wurde schonmal Armenhaus oder Suppenkeller überfallen? :lol:

So das war mein letzter Beitrag dazu wir wolllen ja das Thema nicht zumüllen.

Antworten