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 :

Envoyer une chaine a une application externe


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Envoyer une chaine a une application externe
    j'essaie d'envoyer une chaine des caractères a une application externe .
    J'arrive a envoyer un caractère avec la fonction keybd_event(VK_RETURN, 0, 0, 0); mais pas une chaine.
    J'ai essayé la fonction sendmessage sans résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DataEnvoyes:='toto';
        CopyDataStruct.cbData:=StrLen(DataEnvoyes);//taille des données à envoyer
        CopyDataStruct.lpData:=DataEnvoyes; //adresse de nos données à envoyer
        SendMessage(hTWEL, WM_COPYDATA,WM_ENVOI_ATOM,LongInt(@CopyDataStruct));
    En concret j'appel une appli externe type notepad et je veux envoyer des chaines de caractéres .

    Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Une petite recherche dans le Forum sur Notepad et envoyer, je suis que tu aurais trouvé, ...

    http://www.developpez.net/forums/sho...er+caract%E8re
    http://www.developpez.net/forums/sho...er+caract%E8re

    bon c'est noyé, mais ce code permet d'envoyer du text dans le champ 'Nom du Fichier' dans n'importe quel boite de dialoque 'Ouvrir' standard windows

    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
    procedure TFrmTestStructureMemoire.Button14Click(Sender: TObject);
    var
      HwndEdit: HWND;
      lpClassName: PChar;	// pointer to class name
      lpWindowName: PChar; 	// pointer to window name
      lpString: PChar;       // address of string
      HwndParent: HWND;
      HwndChildAfter: HWND;	// handle to a child window
      lpszClass: PChar;	    // pointer to class name
      lpszWindow: PChar;	    // pointer to window name
      lpRes : array[0..256] of Char;
    begin
          lpClassName:= nil; //'#32770';	// pointer to class name
          lpWindowName:= 'Ouvrir'; 	// pointer to window name
          {Récupère le handle de la boite de dialogue Ouvrir}
          HwndParent := FindWindow(lpClassName, lpWindowName);
     
          if HwndParent <> 0 then begin
             if GetWindowText( HwndParent, lpRes, 256) > 0 then begin
                ShowMessage('Parent GetWindowText : ' + lpRes);
             end;
     
             { Mettre la fenêtre au premier plan en connaissant son handle }
             BringWindowToTop(HwndParent);
     
             HwndChildAfter := GetWindow(HwndParent, GW_CHILD);
             if HwndChildAfter <> 0 then begin
     
                lpszClass := 'Edit';
                lpszWindow := nil;
                HwndEdit  := FindWindowEx(HwndParent, HwndChildAfter, lpszClass, lpszWindow);
                if HwndEdit = 0 then begin
                   lpszClass := 'ComboBoxEx32';
                   HwndEdit  := FindWindowEx(HwndParent, HwndChildAfter, lpszClass, lpszWindow);
                end;
                if HwndEdit <> 0 then begin
                   if GetWindowText( HwndEdit, lpRes, 256) > 0 then begin
                      ShowMessage('Old Edit GetWindowText : ' + lpRes);
                   end;
                   lpString := PChar(Edit3.Text);
                   //lpString := nil;
                   //if not SetWindowText(HwndEdit, lpString) then begin
                   //   ShowMessage('SetWindowText : ' + IntToStr(GetLastError()));
                   //end else begin
                       SendMessage(HwndEdit, WM_SETTEXT, 0, Longint(lpString));
                       SendMessage(HwndEdit, CM_TEXTCHANGED, 0, 0);
                       if GetWindowText( HwndEdit, lpRes, 256) > 0 then begin
                          ShowMessage('New Edit GetWindowText : ' + lpRes);
                       end;
                   //end;
                end else begin
                    ShowMessage('FindWindowEx : ' + IntToStr(GetLastError()));
                end;
     
     
             end else begin
                 ShowMessage('GetWindow : ' + IntToStr(GetLastError()));
             end;
          end else begin
              ShowMessage('FindWindow : ' + IntToStr(GetLastError()));
          end;
    end;
    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

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Citation Envoyé par ShaiLeTroll
    Une petite recherche dans le Forum sur Notepad et envoyer, je suis que tu aurais trouvé, ...
    SAuf que ça n'envoie qu'un caractère....
    Par contre,
    Citation Envoyé par msdn
    dwData
    Specifies data to be passed to the receiving application.
    cbData
    Specifies the size, in bytes, of the data pointed to by the lpData member.
    lpData
    Pointer to data to be passed to the receiving application. This member can be NULL.
    et lpData est un pointeur....et le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyDataStruct.lpData:=DataEnvoyes
    n'est pas conforme: affectation directe de 'toto'
    Par contre,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyDataStruct.dwData:=DataEnvoyes
    pourrait marcher ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    SAuf que ça n'envoie qu'un caractère....
    Tu as mas lu les messages

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    While i <= length(vString) do
        begin
          vKey:= ord(vString[i]);
          PostMessage(Handle, WM_CHAR, vKey, 0);
          inc(i);
        end;
    Cela envoie une chaine caractère par caractère mais cela envoi bien la chaine au complet ...

    ensuite qui vous dit que NotePad ou l'application Externe gère le message WM_COPYDATA, perso, c'est rare que les miennes le font ...
    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
     
    type
       TTrucData = record
          I: Integer;
          D: Double;
          C: array[1..60] of Char;
       end;
     
    procedure TFrmTestMemory.BtnSendDataClick(Sender: TObject);
    var
       Truc: TTrucData;
       Data: PCOPYDATASTRUCT;
    begin
       lblHandleMe.Caption := IntToStr(Self.Handle);
       if StrToIntDef(EdHandleOther.Text, 0) <= 0 then
       begin
          Exit;
       end;
     
       Truc.I := MemoSend.Lines.Count;
       Truc.D := Now();
       CopyMemory(@Truc.C, @MemoSend.Lines.Text[1], 60);
     
       New(Data);
       Data.dwData := 0;
       Data.cbData := SizeOf(Truc);
       Data.lpData := @Truc;
       SendMessage(StrToInt(EdHandleOther.Text), WM_COPYDATA, Self.Handle, LongInt(Data));
     
       Dispose(Data);
    end;
     
    procedure TFrmTestMemory.ReceiveData(var message: TMessage);
    var
       Truc: TTrucData;
       Data: PCOPYDATASTRUCT;
       Reveive: PChar;
    begin
       if message.LParam > 0 then
       begin
          CopyMemory(@Truc, PCOPYDATASTRUCT(message.LParam).lpData, PCOPYDATASTRUCT(message.LParam).cbData);
     
     
          MemoReceive.Lines.Text := Truc.C;
          MemoReceive.Lines.Add(IntToStr(Truc.I));
          MemoReceive.Lines.Add(FormatDateTime('dddd dd mm yyyy hh:nn:ss zzz', Truc.D));
       end;
    end;
    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

  5. #5
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Citation Envoyé par ShaiLeTroll
    Tu as mas lu les messages
    Mais non, je t'assure...

    Ce que tu proposes n'est qu'une solution de contournement qui fait abstraction du contexte initial (SendMessage).

    Dans le même ordre d'idée, on peut imaginer une solution (aussi de contournement ) passant par le clipboard, suivie d'une SendMessage(..,WM_PASTE,0,0) vers l'appli cible.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Je ne fais aucun contournement !

    Notepad n'a jamais géré le message WM_COPYDATA, ... comme il le prend comme exemple, je propose une solution pour envoyer une chaine soit WM_CHAR, soit WM_SETTEXT qui fonctionne avec NotePad, ...

    Maintenant son exemple est peut-être maladroit, cela manque d'explication, envoyer une chaine dans un Edit d'une application, ou envoyer une chaine dans la "mémoire" d'une autre application, cela est très différent, et dans ce cas, j'ai fourni un code qui fonctionne (en tout cas avec deux instances de mon exe de tests, vu que je ne connais pas d'application qui gère le WM_COPYDATA et encore moins la structure de la données ...)
    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

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Essayes donc le code suivant qui marche pour insérer du texte dans des cibles externes comportant une lucarne de saisie :
    - du type tEdit, tMemo, tRichEdit, tStringGrid si leur ReadOnly:=false (sinon rien ne se passe),
    - du type champ 'adresse' d'Internet Exploreur,
    - dans la présente lucarne de saisie du Forum: texte à insérer dans dernière lucarne pointée par un click-souris marquant le point d'insertion,
    - dans le Bloc-Notes NOTEPAD de Windows.

    Par contre il ne marche pas pour insérer du texte dans l'éditeur de Delphi ... mais cela n'aurait pas d'intérêt ... simplement signalé car mon premier essai l'avait visé comme cible externe.

    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
    //Insérer texte dans lucarne-texte d'applis externes :
     
    var HCible : HWnd;
     
    procedure TfrmEmetteur.Timer1Timer(Sender: TObject); // ici on récupère le Handle de la lucarne-texte survolée par le curseur-souris à l'instant où le click-souris lui donne le Focus
    var       HCourant : HWnd;
              SourisBG,SourisBD : integer;
    begin     if HCible<>0 then EXIT; // <: indispensble pour préserver le contenu de HCible d'une modif lors du mouvement de retour de la souris vers le bouton bEnvoyer
              HCourant:=WindowFromPoint(Mouse.CursorPos);
              label1.caption:='HCourant = '+intToStr(HCourant);
              sourisBG:=getAsyncKeyState(VK_LButton);
              sourisBD:=getAsyncKeyState(VK_RButton);
              if (sourisBG<>0) or (sourisBD<>0)
              then HCible:=HCourant;
              label2.caption:='HCible = '+intToStr(HCible);
    end;
     
    procedure TfrmEmetteur.bEnvoyerClick(Sender: TObject); // Ici on envoie le texte à insérer dans la lucarne-cible
    var       //Texte : array[0..1000] of Char;
              Texte2 : string;
              i : integer;
    begin     // 1ère approche :
              //Texte:='texte à envoyer vers fen qui a le focus-clavier';
              //SetWindowText(HCible,Texte); <: ne marche que si HCible est sur Form émettrice
     
              // 2ème approche qui marche mieux :
              Texte2:='texte à insérer dans dernière lucarne pointée par un click-souris marquant le point d''insertion';
              for i:=1 to length(Texte2)
              do PostMessage(HCible,WM_CHAR,Ord(Texte2[i]),0); //<: marche avec cibles tEdit, tMemo, tRichEdit et similaires où ReadOnly:=false;
              HCible:=0; label2.caption:='';
    end;
     
    initialization
               HCible:=0;
               // avec en plus fsStayOnTop pour la Form émettrice
    end.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    Shai était dans le vrai, j'ai bien 2 applications (faites par moi donc j'ai le code source des deux) qui doivent communiquer entre elles.

    J'ai testé le code de Shai, ça fonctionne "à peu près". Des fois j'ai des access violation aléatoirement ... J'ai compris le principe, mais je n'arrive pas à trouver d'où ça pourrait merdouiller.

    Déja le receiver ne fonctionne pas, CopyMemory plante (access violation) à chaque fois. En mettant ce code en commentaire, c'est le send qui plante, aléatoirement, en faisant un access violation.

    un peu compliqué tout ça je trouve pour envoyer une bête donnée entre 2 applis ...

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/05/2011, 09h26
  2. comment supprimer une chaine d'une chaine?
    Par Philippe PONS dans le forum Framework .NET
    Réponses: 3
    Dernier message: 28/05/2007, 10h47
  3. Tester une chaine dans une chaine
    Par ulysse031 dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 26/03/2007, 00h48
  4. chercher caractére d'une chaine dans une chaine
    Par ulysse031 dans le forum Langage
    Réponses: 25
    Dernier message: 21/03/2007, 18h09
  5. Réponses: 2
    Dernier message: 19/10/2005, 15h38

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