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

C Discussion :

Contenu texte du presse papier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 58
    Par défaut Contenu texte du presse papier
    Bonjour,

    Quelqu'un pourrait-il me proposer une fonction C qui renvoie avec le type char* le contenu texte du presse papier système (Clipboard). J'aimerai disposer des versions de cette fonction tant pour Windows que pour Linux.

    De même j'aimerai bien avoir les fonctions sous Windows et Linux qui fassent l'opération inverse, à savoir mettre le contenu d'un char* sous la forme d'un texte dans le presse papier système.

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Sous Windows, regarde du côté de OpenClipboard() et ses fonctions sœurs. Mais c'est compliqué et basé sur des vieux mécanismes, tu ferais donc mieux d'utiliser une bibliothèque portable qui le ferait pour toi.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 58
    Par défaut Une solution qui a l'air de fonctionner pour Windows - Miracle ?
    Merci pour le pointeur. La petite bibliothèque suivante permet bien de lire le presse papier et d'y écrire à partir d'une console sous Windows. Par contre je ne sais pas si elle est écrire dans les règles de l'art concernant la gestion des erreurs (sans doute pas...). Je ne sais pas ce qu'elle peut donner sous Linux.

    Le fichier Interface de la bibliothèque : Presse_Papier.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const char* Lire_du_PressePapier();
     
    void Ecrire_dans_PressePapier(const char* w);
    et le corps de la bibliothèque : Presse_Papier.c
    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
    #include <windows.h>
    #include <stdio.h>
    #include "Presse_Papier.h"
     
    void BailOut(char *msg)
    {
      fprintf(stderr, "Exiting: %s\n", msg);
      exit(1);
    }
     
    const char* Lire_du_PressePapier()
    {
      HANDLE h;   
      if (!OpenClipboard(NULL)) BailOut("Presse-Papier impossible à ouvrir");   
      h = GetClipboardData(CF_TEXT); 
      CloseClipboard();
      return (char *) h; 
    }
     
     
      void Ecrire_dans_PressePapier(const char* w)
      {
        const size_t len = strlen(w) + 1;
        HGLOBAL hMem =  GlobalAlloc(GMEM_MOVEABLE, len);
        memcpy(GlobalLock(hMem), w, len);
        GlobalUnlock(hMem);
        OpenClipboard(0);
        EmptyClipboard();
        SetClipboardData(CF_TEXT, hMem);
        CloseClipboard();
      }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 58
    Par défaut La lecture et l'écriture du Pressse-Papier
    Après génération par compilation du fichier objet Presse_Papier.o, le binding vers Ada de cette petite bibliothèque marche bien :

    Fichier interface Ada :
    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
    pragma Ada_2012;
    pragma Style_Checks (Off);
     
    with Interfaces.C; use Interfaces.C;
    with Interfaces.C.Strings;
     
    package Presse_Papier_h is
     
       function Lire_du_PressePapier return Interfaces.C.Strings.chars_ptr;  -- Presse_Papier.h:2
       pragma Import (C, Lire_du_PressePapier, "Lire_du_PressePapier");
     
       procedure Ecrire_dans_PressePapier (w : Interfaces.C.Strings.chars_ptr);  -- Presse_Papier.h:4
       pragma Import (C, Ecrire_dans_PressePapier, "Ecrire_dans_PressePapier");
     
    end Presse_Papier_h;
    Programme de test en Ada :
    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
    pragma Ada_2012;
    pragma Style_Checks (Off);
     
    with presse_papier_h;
    use presse_papier_h;
    with Interfaces.C; use Interfaces.C;
    with Interfaces.C.Strings; use Interfaces.C.Strings;
    with Ada.Text_IO; use Ada.Text_IO;
     
     
    procedure Main_Ada is
    PRAGMA Linker_Options("d:\PROGRAMMATION\C\Clipboard\Presse_Papier.o") ; 
     
    Function Lire return string is
    K : constant Chars_Ptr := Lire_du_PressePapier;
     
    begin
      return Value(K);
     
    end;
     
    begin
      Put_Line(Value(Lire_du_PressePapier));
      Ecrire_dans_PressePapier(New_String("Emile8 vous salue bien !"));
     
    end Main_Ada;

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Je ne vois rien là-dedans qui dit comment la string retournée par la fonction C est censée être libérée... En d'autres termes, grosse fuite de mémoire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 58
    Par défaut Fuite ... Quelle fuite ?
    À la lecture, on ne touche pas au contenu du Clipboard (Presse papier). On se contente de manipuler un pointeur vers ce contenu. Je ne pense pas qu'il puisse y avoir de fuite au niveau de la place mémoire occupée par ce pointeur si les retours fonctions se font bien par copie.

    À l'écriture dans le Clipboard, au niveau de la fonction C, on fait bien attention d'appeler une fonction spécifique qui vide ce Clipboard de son contenu, ce qui doit correctement restituer la mémoire si cette fonction est bien conçue. Si le souci est du coté Ada, c'est la fonction New_String qui construit un Char* avec la zone mémoire qu'il permet de contrôler à partir de son paramètre String Ada. Ce Char* est transmit par copie à la fonction C qui copie la mémoire qu'il contrôle dans le Clipboard. Ada par la suite, à la sortie de son bloc, libèrera le Char* et l'empreinte mémoire qui lui avait été initialement associée.

    À priori si je ne me trompe pas, je ne pense pas qu'il y ait de mécanisme de fuite mémoire si mes hypothèses sont bonnes.

Discussions similaires

  1. Coller une image contenu dans le Presse papier dans un contrôle Image VBA
    Par Fredooooo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/01/2016, 21h59
  2. [XL-2010] Rechercher et remplacer un texte contenu dans le presse papier
    Par fate1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/06/2015, 14h25
  3. [Toutes versions] Copier contenu Textbox dans presse papier
    Par zouille dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 09/02/2014, 10h43
  4. Réponses: 13
    Dernier message: 15/09/2010, 14h18
  5. Selection Text et presse papier
    Par Mozofeuk dans le forum Silverlight
    Réponses: 3
    Dernier message: 20/05/2010, 10h00

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