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

  1. #1
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Points : 157
    Points
    157
    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 : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    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 habitué
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Points : 157
    Points
    157
    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 averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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
    Points : 314
    Points
    314
    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
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 678
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 678
    Points : 7 097
    Points
    7 097
    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;

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

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Points : 157
    Points
    157
    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 sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 669
    Points : 25 473
    Points
    25 473
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 941
    Points : 15 393
    Points
    15 393
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 941
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 941
    Points : 15 393
    Points
    15 393
    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 régulier

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 105
    Points : 84
    Points
    84
    Par défaut
    J'ai essayé et ça marche pas , peut-tu m'envoyer l'exemple que t'as créé STP.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 941
    Points : 15 393
    Points
    15 393
    Par défaut
    Citation Envoyé par Zaki_SDwin Voir le message
    J'ai essayé et ça marche pas , peut-tu m'envoyer l'exemple que t'as créé STP.
    J'ai essayé quoi ?
    ça marche pas : comm' d'hab'... Qu'est-ce qui ne fonctionne pas ? Comment ça se comporte ? Messages d'erreurs ?
    Peux-tu m'envoyer l'exemple ...: à qui tu causes ? À moi ? À ShaiLeTroll ? À Medgir ? À Lung ? À ... ? Si c'est à moi, de quel exemple tu parles ?
    --
    jp

  12. #12
    Membre régulier

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 105
    Points : 84
    Points
    84
    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.

  13. #13
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 941
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 941
    Points : 15 393
    Points
    15 393
    Par défaut
    Ben oui, chez moi ça fonctionne... Ça a l'air de fonctionner également pour celui (ou celle) qui a pondu le code posté par Lung.
    Qu'est-ce que tu veux que je te dise de plus ? Repasse ton code à la loupe, tu as peut-être foiré quelque chose au copier/coller ?
    Une idée vit' fait : ton panel "conteneur" est-il assez grand pour contenir une instance du Bloc-notes ? Encore que, si tu regardes bien mon image, mon panel n'est pas très grand (peut pas te donner les valeurs, ch'suis pas sous Delphi, là).
    --
    jp

  14. #14
    Membre régulier

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 105
    Points : 84
    Points
    84
    Par défaut
    Ben je me trompe pas sur copier/coller , merci pour ta réponse si tu veux envoie moi l'exemple, @ +

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 941
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 941
    Points : 15 393
    Points
    15 393
    Par défaut
    Plutôt que de t'envoyer l'exemple (qui est exactement le code posté par Lung), parle-nous donc de ton système d'exploitation, du compte que tu utilises (Admin ou user), de ta version de Delphi, etc.
    Si tu vois un homme qui a faim, ça ne sert à rien de lui donner un poisson : apprends-lui à pêcher !
    --
    jp

  16. #16
    Membre régulier

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 105
    Points : 84
    Points
    84
    Par défaut
    Le système d'exploitation est : Windows XP service pack 2
    J'utilise Delphi 7 professionnel
    Le compte de la session est : Administrateur

  17. #17
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 941
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 941
    Points : 15 393
    Points
    15 393
    Par défaut
    Yep !

    La config n'a rien à voir : me suis souvenu d'un truc, important, c'est qu'il ne faut pas faire tourner le prog conteneur dans l'IDE de Delphi ! Ça reproduit exactement le problème que tu constates !
    Il faut donc créer l'exe "conteneur" et le lancer en double-cliquant dessus, comme n'importe quel prog, et là, bingo !, tout va bien.
    Je viens de retester/confirmer juste avant d'écrire ce post.

    Valà valà valà, et bon dimanche !
    --
    jp

  18. #18
    Membre régulier

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 105
    Points : 84
    Points
    84
    Par défaut
    ça ne marche toujours pas, et ben l'ami comme tu ne voulais pas envoyer l'exemple, en vas passez 3 ans pour connaitre le problème , donc envoie l'exemple et comme ça je vais trouver ou est l'erreur et je la poste ici ,

    Si tu vois un homme qui a faim, ça ne sert à rien de lui donner un poisson : apprends-lui à pêcher !
    à propos de la poisson, crois moi c'est pas pareil @+.

  19. #19
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 941
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 941
    Points : 15 393
    Points
    15 393
    Par défaut
    Ah,
    il y a une 'tite différence entre le code posté et celui que j'utilise :

    code posté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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;
    code modifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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, panel1.Width, panel1.Height, 0); 
     
        // On change le parent de la fenêtre par notre panel (par exemple) 
        Windows.SetParent(h, panel1.Handle); 
      end; 
    end;
    C'est la seule différence avec le code posté par Lung.

    Valà,
    --
    jp

  20. #20
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 292
    Points : 1 944
    Points
    1 944
    Par défaut
    Jipété > Faire tourner le programme conteneur dans l'ide ne pose pas de souci, ou en tout cas je n'en ai pas rencontré. (on parle bien de le lancer avec l'ide?).

    Zaki_SDwin> en mode pas à pas, h est bien différent de 0?

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