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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 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
    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
    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 confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    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 ?

  4. #4
    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
    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 confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    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.

  6. #6
    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
    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

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