IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Afficher une autre application dans un exe


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Par défaut Afficher une autre application dans un exe
    Il y a quelque temps j'avais récupéré il me semble sur ce site, un bout de code qui permettait d'afficher notepad dans une fenetre delphi.

    Je ne veux pas lancer une notepad à l'extérieur de mon programme, mais bien au sein de mon programme.

    Je pense que je dois être fatigué, mais j'ai beau chercher sur le net, dans le forum.. mais je ne retrouve rien...

    Est ce que quelqu'un peut m'aider?

    Merci d'avance

  2. #2
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Qu'est-ce que tu veux dire par
    bien au sein de mon programme
    ShellExecute ne te satisferait pas ?

  3. #3
    Membre éprouvé
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Par défaut
    Non, je ne croit pas que shellexecute permet d'afficher dans une fenetre de mon programme notepad ou autre.. En fait, shellexecute lance une instance de notepad à l'extérieur mon programme.

    Je vais continuer de chercher

  4. #4
    Membre éclairé Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Par défaut
    alors si j'ai bien compris,tu veux charger un fichier text etc... a l'interieur de ta fiche?

    si c'est sa alors dans une forme colle un RichEdit et un boutonet un OpenDialog

    puis colle ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    OpenDialog1.execute;
      RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
    end;
    en esperant t'avoir aider

  5. #5
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par MedGIR Voir le message
    Il y a quelque temps j'avais récupéré il me semble sur ce site, un bout de code qui permettait d'afficher notepad dans une fenetre delphi.

    Je ne veux pas lancer une notepad à l'extérieur de mon programme, mais bien au sein de mon programme.
    J'ai trouvé çà (c'est pas de moi):
    1 - tu lance Notepad grace à la fonction CreateProcess
    2 - tu récupère le ProcessID de l'instance de Notepad que tu viens de lancer
    3 - tu énumère l'ensemble des fenêtres en recherchant celle qui appartiennent au processus dont le ProcessID (PID) correspond à celui que tu as récupéré.
    4 - Tu prends le premier handle de fenêtre (en principe pour Notepad, il ne devrait y en avoir qu'un).
    5 - Tu utilise ce handle pour "trafiquer" la fenêtre.

    Voici un exemple complet bricolé à partir des éléments de la FAQ. Ce n'est pas très élégant, mais ça fonctionne. A améliorer.

    Code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    type 
      PFindWindowsStruct = ^TFindWindowsStruct; 
      TFindWindowsStruct = record 
        ProcessID: DWORD; 
        HandleList: TList; 
      end; 
     
    function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): boolean; stdcall; 
    var 
      dwProcessId: DWORD; 
    begin 
      if lParam <> 0 then 
      begin 
        GetWindowThreadProcessId(hwnd, dwProcessId); 
        with PFindWindowsStruct(lParam)^ do 
          if dwProcessID = ProcessID then 
            HandleList.Add(Pointer(hwnd)); 
        result:= true; 
      end 
      else 
        result:= false; 
    end; 
     
    procedure FindProcessWindows(ProcessID: Integer; Handles: TList); 
    var 
      findWindowsStruct: TFindWindowsStruct; 
    begin 
      findWindowsStruct.ProcessID:= ProcessID; 
      findWindowsStruct.HandleList:= Handles; 
      EnumWindows(@EnumWindowsProc, Integer(@findWindowsStruct)); 
    end; 
     
    function NotepadPID: Cardinal; 
    var 
      StartInfo: TStartupInfo; 
      ProcessInfo: TProcessInformation; 
    begin 
      result:= 0; 
      { Mise à zéro de la structure StartInfo } 
      FillChar(StartInfo, SizeOf(StartInfo), #0); 
      { Seule la taille est renseignée, toutes les autres options } 
      { laissées à zéro prendront les valeurs par défaut } 
      StartInfo.cb:= SizeOf(StartInfo); 
     
      { Lancement de la ligne de commande } 
      if CreateProcess(nil, 'Notepad.exe', nil, nil, false, 
        0, nil, nil, StartInfo, ProcessInfo) then 
        result:= ProcessInfo.dwProcessId 
      else 
        RaiseLastOSError; 
    end; 
     
    function FindHandle(PID: Cardinal): HWND; 
    const 
      TIMEOUT = 5000; // 5 secs 
    var 
      handles: TList; 
      ticks: DWORD; 
    begin 
      handles:= TList.Create; 
      ticks:= GetTickCount; 
      try 
        while (handles.Count = 0) and (GetTickCount - ticks < TIMEOUT) do 
          FindProcessWindows(PID, handles); 
        if handles.Count > 0 then 
          result:= HWND(handles[0]) 
        else 
          result:= 0; 
      finally 
        handles.Free; 
      end; 
    end; 
     
    function StartNotepad: HWND; 
    var 
      pid: Cardinal; 
    begin 
      pid:= NotepadPID; 
      result:= FindHandle(pid); 
    end; 
     
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      h: HWND; 
    begin 
      h:= StartNotepad; 
      if h <> 0 then 
      begin 
        // On change la taille de la fenêtre 
        SetWindowPos(h, 0, 0, 0, 320, 200, 0); 
     
        // On change le parent de la fenêtre par notre panel (par exemple) 
        Windows.SetParent(h, panel1.Handle); 
      end; 
    end;
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Par défaut
    Merci beaucoup Lung, je vais essayer... il me semble que cela ressemble à ce que j'avais trouvé...

    Merci aussi à shell13010, mais non malheureusement je ne veux pas afficher du texte dans mon programme, Notepad était un exemple... Je voulais juste afficher la fiche principale d'un exécutable dans une fenêtre de mon programme. J'avais réussi à la faire il y a quelque temps... mais maintenant je ne me souviens plus...

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Le Windows.SetParent (la précision de l'unité est importante) fonctionne par exemple pour prendre le TreeView de l'explorateur Windows et le coller dans son application ... attention au violation d'accès ... voir ce sujet
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 131
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 131
    Par défaut
    Salut,

    Mon grain de sel :

    Le code posté par Lung (merci à lui)
    • fonctionne très bien avec le Bloc-notes (qui se redimensionne pour s'adapter au panel),
    • moyennement avec la Calculatrice (car non redimensionnable),
    • et très très mal avec un bête prog de test créé sous Delphi ne comportant qu'une simple feuille (redimensionnable) avec un bête bouton : j'ai bien quelque chose qui s'affiche dans le panel, mais pas de la couleur de la form de test, sans le bouton, avec barre de titre et boutons min-max-close, mais surtout, la "vraie" form du prog de test s'affiche à côté du prog conteneur... Le truc qui se met dans le panel s'y met avec le nom du prog en caption, quand le prog de test affiche bien le caption que j'ai créé.

    Sur l'image jointe, en haut le prog conteneur, en bas le prog de test, qui devrait être contenu...

    Bon, c'est pas mon topic mais je voulais en faire part à la communauté (j'aime bien jouer avec ce genre de truc).
    Mes 2 cts,
    --
    jp
    Images attachées Images attachées  

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 131
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 131
    Par défaut Une info complémentaire...
    Yep !

    Il se trouve que je dispose de 2 progs, petits, très petits (13 et 15 ko), vous savez, ce genre de choses où l'on joue directement avec les API pour créer des petits exe's, totalement inutiles sauf pour ce genre de challenge.

    L'un se contente d'afficher HelloWorld dans une form blanche tout en jouant un .wav au FormCreate, l'autre est quand même équipé de trois Listbox et trois boutons : eh bien, ces deux programmes s'affichent parfaitement dans le panel de destination !

    Est-ce à dire que le défaut constaté dans mon post précédent est lié à la manière dont l'exe est fabriqué par Delphi (prog modifié en ayant viré l'unique bouton et la seule ligne de code qu'il contenait, défaut toujours présent) ?

    Valà,
    --
    jp

  10. #10
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 105
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Salut,

    Mon grain de sel :

    Le code posté par Lung (merci à lui)
    • fonctionne très bien avec le Bloc-notes (qui se redimensionne pour s'adapter au panel),
    • moyennement avec la Calculatrice (car non redimensionnable),
    • et très très mal avec un bête prog de test créé sous Delphi ne comportant qu'une simple feuille (redimensionnable) avec un bête bouton : j'ai bien quelque chose qui s'affiche dans le panel, mais pas de la couleur de la form de test, sans le bouton, avec barre de titre et boutons min-max-close, mais surtout, la "vraie" form du prog de test s'affiche à côté du prog conteneur... Le truc qui se met dans le panel s'y met avec le nom du prog en caption, quand le prog de test affiche bien le caption que j'ai créé.

    Sur l'image jointe, en haut le prog conteneur, en bas le prog de test, qui devrait être contenu...

    Bon, c'est pas mon topic mais je voulais en faire part à la communauté (j'aime bien jouer avec ce genre de truc).
    Mes 2 cts,
    --
    jp
    Cela est ton message, t'as dit que ça fonctionne, pour moi le programme se compile sans aucune erreur, mais lorsque je clic sur le bouton le NotePad.exe ne se met pas dans le TPanel mais il s'exécute comme si on utilise ShellExecute.

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/03/2009, 12h36
  2. [Liferay] Inclusion de pages d'une autre application dans liferay
    Par ASPAK dans le forum Portails
    Réponses: 1
    Dernier message: 30/10/2008, 16h57
  3. Coller dans une autre application
    Par johweb dans le forum Delphi
    Réponses: 4
    Dernier message: 21/06/2006, 14h47
  4. Afficher une page web dans une autre page sans frame
    Par bahs dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/03/2006, 17h51
  5. Envoyer du texte dans une autre application (ou send key)
    Par Coussati dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 10/02/2006, 15h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo