Transférer du texte au presse-papiers

 

 

Pour transférer les données de type texte (type CF_TEXT), il faudra utiliser des fonctions plutôt anciennes, mais compatibilité oblige..

Tout d'abord récupérer un handle sur un bloc mémoire relogeable pour lequel il faudra indiqué la taille voulue (classique !)
hMem = GlobalAlloc (GHND, (DWORD) length + 1);

Où length est la taille du texte à envoyer, +1 car il ne faut pas oublier le NULL à la fin du texte !
Le drapeau GHND permet de mettre la zone mémoire à 0. Il ne sera donc pas nécessaire de transmettre le caractère NULL.
GHND étant la combinaison de GMEM_MOVEABLE et GMEM_ZEROINIT (Voir chapitre sur l'allocation mémoire)

Puis, si hMem est différent de 0, demandez un pointeur sur cette mémoire et comme la zone mémoire est relogeable, il faudra que le système la vérouille, sinon le pointeur n'a pas de signification !

lpMem = GlobalLock (hMem);

Vous pourrez ensuite copier la chaîne de caractères dans le tampon.

Puis dévérouillez le bloc mémoire: GlobalUnlock (hMem);

Enfin, indiquez au presse-papiers la zone mémoire contenant les données et le type de données.

En commençant par ouvrir le presse-papiers
BOOL OpenClipboard (HWND);

Il faut impérativement tester la valeur en sortie (contrairement à ce qui pouvait être dit sous Windows 3.1), car une autre application peut-être en train d'accéder au presse-papiers.

Si tout est ok, Vider celui-ci (il y a peut-être déjà des données):
EmptyClipboard();

Indiquer le type des données et le handle de la zone mémoire contenant les données:
SetClipboardData (CF_TEXT, hMem);

Image non trouvée ! A partir de maintenant, il faut considérer que l'application n'est plus propriétaire de la zone mémoire contenant les données.
Le presse-papiers a effectué une commande de type GlobalReAlloc (hMem, 0L, GMEM_MODIFY | GMEM_SHARE);
Expliquant ainsi qu'à la fin de votre application, les données soient toujours conservées dans le presse-papiers.
En fait, c'est la fonction EmptyClipboard() qui va détruire le bloc mémoire.
Par conséquent, il faudra considérer que la valeur du handle hMem est invalide. Il est ainsi préférable de mettre la valeur 0 dans la variable utilisée pour éviter toutes erreurs ensuite.
hMem = 0;

Image non trouvée ! Il ne faut surtout pas donner au presse papiers un bloc mémoire vérouillé, dévérouillez le avant !

Image non trouvée !Il est tout à fait possible de passer une valeur NULL à la place de hMem. Mais il s'agit d'un cas particulier qui sera étudié dans le chapitre restitution différée.

Puis terminez la communication avec le presse-papiers:
CloseClipboard();


Image non trouvée ! N'oubliez pas de refermer le presse papiers !

 

 

Voici un exemple avec un menu qui propose copier/coller.

Seule la partie copier est programmée, la seconde partie sera étudiée dans le chapitre suivant.

L'option copier place le texte "Hello World..." dans le presse-papiers. Pour vérifier que cela marche, lancez par exemple le bloc note puis faîtes coller dedans. Le texte devrait apparaître !

Image non trouvée !