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

 Delphi Discussion :

Copier un fichier audio depuis le presse papier D6 et Windows 10 64bits


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut Copier un fichier audio depuis le presse papier D6 et Windows 10 64bits
    Bonjour à toutes et à tous,

    En ayant vu beaucoup de sources pour le copy coller, j'ai quand même un problème concret, le chemin du fichier audio se trouve dans Ednom.text :

    Code pour coller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //ednom.PasteFromClipboard;
     sendmessage(ActiveControl.handle,WM_PASTE,0,0);
    Mon fichier audio est bien copié dans le presse papier, la preuve dans le dossier, si je fais un Ctrl + v, il est coller dans le dossier.

    J'ai testé aussi avec l'évent des touches clavier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
    keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0);
    keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
    Et cela ne fonctionne pas.

    Maintenant du texte vers un Tmemo ou Tedit c'est ok.

    Merci si quelqu'un avait une idée.

    @+,

    cincap

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Avec un simple "copier", le presse-papier peut contenir plusieurs formes de représentation de la donnée mais PasteFromClipboard (WM_PASTE) ne va coller que celle du type CF_TEXT (ou CF_UNICODETEXT si l'app cible est unicode).

    Lorsque tu copies un fichier, son nom n'est pas d'un format TEXT mais FILENAME (ou FILENAMEW si l'app source est unicode ou parfois les deux). Tu es donc obliger de récupérer toi-même cette donnée.

    Ça donne quelque chose comme ceci :
    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
    var
      CF_FILENAME  :integer;
      CF_FILENAMEW :integer;
     
    function GetFilenameFromClipboard :string;
    var
      Formats :array of integer;
      CF      :integer;
      Data    :THandle;
      pData   :pointer;
     
    begin
      Result := '';
     
      if OpenClipboard(0) then
      try
        //Récupère de préférence le format Unicode
        Formats := [CF_FILENAMEW, CF_FILENAME];
        CF := GetPriorityClipboardFormat(Formats[0], Length(Formats));
     
        if CF > 0 then
        begin
          Data  := GetClipboardData(CF);
          pData := GlobalLock(Data);
     
          try
            if CF = CF_FILENAMEW
            then Result := PChar(pData)
            else Result := PAnsiChar(pData);
     
          finally
            GlobalUnlock(Data);
          end;
        end;
     
      finally
        CloseClipboard;
      end;
    end;
     
    initialization
      CF_FILENAME  := RegisterClipboardFormat('FILENAME');
      CF_FILENAMEW := RegisterClipboardFormat('FILENAMEW');
    Tu devra bien sûr l'adapter pour D6 (PChar, PWideChar).

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    @ Andnotor,

    Merci de ta réponse, cela faisait longtemps

    J'étais bien conscient que le format autre que text ou bitmap était moins malléable c'est pour cela que j'utilisais ce code pour copier ;

    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
     
    var
      i, len: Integer;
      hMem: THandle;
      ptr: PByte;
      dropfiles: PDropFiles;
    begin
      // On commence par récupérer la longueur totale de la "liste" de chaînes
      len:= 0;
      for i:= 0 to Filenames.Count - 1 do
        Inc(len, Length(Filenames[i]) + 1);
     
      if len <> 0 then
      begin
        Inc(len); // Ajout d'un octet pour le zéro terminal
     
        // Allocation d'un buffer pour la structure _DROPFILES + la chaîne complète
        hMem:= GlobalAlloc(GMEM_MOVEABLE, SizeOf(_DROPFILES) + len);
        dropFiles:= GlobalLock(hMem);
     
        dropFiles.pFiles:= SizeOf(_DROPFILES);
        dropFiles.pt:= Point(0, 0);
        dropFiles.fNC:= false;
        dropFiles.fWide:= false;
     
        // On positionne un pointeur juste après la structure
        ptr:= Pointer(Integer(dropFiles) + SizeOf(_DROPFILES));
     
        // Et on copie les chemins en les séparant par des zéros
        for i:= 0 to Filenames.Count - 1 do
        begin
          Move(Filenames[i][1], ptr^, Length(Filenames[i]));
          Inc(Integer(ptr), Length(Filenames[i]));
          ptr^:= 0;
          Inc(Integer(ptr));
        end;
        // La "liste" de chaînes doit être terminée par un autre zéro
        ptr^:= 0;
        // On a donc : StructureChemin1#0Chemin2#0#0
     
        // Ne pas oublier de déverrouiller la zone mémoire
        GlobalUnlock(hMem);
     
        // Il ne reste plus qu'à injecter ça dans le presse-papier
        with ClipBoard do
        begin
          Open;
          Clear;
          SetAsHandle(CF_HDROP, hMem);
          Close
        end;
      end;
    Comme à ce niveau il n'y avait pas de problème, je pensais que récupérer la commande comme ctrl + v ou du sous menu "Coller" qui fonctionne serait assez facile mais non….

    Je pense que c'est plus un problème de Handle sur la fenêtre de l'Exploreur de Windows.

    Depuis ITunes, avec ce code, je peus coller mon fichier c'est ce qui comptait pour moi.

    Car coller mon fichier dans un dossier il faut peut être un conteneur.

    @+,

    cincap

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Citation Envoyé par cincap Voir le message
    c'est pour cela que j'utilisais ce code pour copier ;
    Et bien si c'est toi qui écris, tu devrais pouvoir faire l'inverse pour lire

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ Andnotor, merci de ta réponse, après coup je me suis rendu compte que c'était ridicule de chercher à sauvegarder directement mon fichier audio dans le même dossier puisque l'important était de le copier dans le clipboard pour le coller dans un autre logiciel.

    Il suffisait donc d'ajouter à la fin de mon code si on voulait aussi la copie du fichier dans le même dossier de l'application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    fileSource := Ednom.Text;
    fileDest := ExtractFileDir(Application.ExeName)+ '\' + ExtractFileName(Ednom.Text);
     
    CopyFile(PChar(fileSource), PChar(fileDest), False);
    Ce topic peut être fermé.

    @+,

    cincap

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. copier/coller des graphiques dans le presse-papier
    Par legos dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 11/01/2007, 14h04
  2. Transférer fichier de serveur vers presse-papier
    Par gilleluc dans le forum Applets
    Réponses: 2
    Dernier message: 02/10/2006, 03h15
  3. Copier une page CppWebBrowser danse le press papier
    Par Shikamaru86 dans le forum C++Builder
    Réponses: 10
    Dernier message: 21/09/2006, 15h52
  4. [TP] Copier une variable string dans le presse-papier
    Par astyan dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 04/08/2006, 23h47
  5. Copier une image (jpeg) dans le presse papier
    Par benj63 dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2002, 15h51

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