Partage
  • Partager sur Facebook
  • Partager sur Twitter

Plusieurs presse-papiers sous W10 ?

23 février 2018 à 23:39:55

Yop.

Contrairement à beaucoup (J'ai fouillé un peu, beaucoup de gens veulent savoir comment avoir plusieurs presse-papiers, mais c'est pas ma question.), je suis sur un "mystère".

J'ai un script qui envoie du texte dans le presse-papier, ça fonctionne très bien, à un détail près : quand je colle les données, elles ne sont pas les mêmes partout. Encore plus mystérieux : ça n'arrive pas à chaque fois. Là, j'ai essayé de le reproduire pour tester divers cas de figure, avec différents encodages et des caractères bien difficiles à gérer, aucun souci. Ça n'arrive que quand j'y pense pas, sinon où serait le fun ?

Exemple : tout à l'heure, je l'ai lancé, comme d'hab', puis j'ai collé le contenu du presse-papier dans mon navigateur : ça a affiché un énorme texte copié trois heures plus tôt. Sans rien faire d'autre, j'ai ensuite collé le contenu dans un éditeur de texte : le texte voulu (Une grosse douzaine de caractères) s'est affiché nickel. J'ai pas testé ailleurs (Flemme.).

Bref. D'où vient cette sorcellerie ?

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 mars 2018 à 17:51:54

Ça doit probablement venir de ton script. Pourrais-tu le poster?
  • Partager sur Facebook
  • Partager sur Twitter
2 mars 2018 à 0:58:08

Il est un peu indigeste. Je poste juste la partie qui gère le presse-papier, si quelqu'un veut tester je posterai une version qui ne nécessite pas mes fichiers. (C'est du Perl.)

C'est pas moi qui avais debug ça, tout ce qui est importé à partir de 'user32', je sais pas du tout ce que ça fait.

use Win32::API 'WriteMemory';
Win32::API->Import('kernel32', 'HGLOBAL  GlobalAlloc( UINT uFlags, SIZE_T dwBytes )') or die;
Win32::API->Import('kernel32', 'UINT_PTR GlobalLock( HGLOBAL hMem )') or die;
Win32::API->Import('kernel32', 'BOOL     GlobalUnlock( HGLOBAL hMem )') or die;
Win32::API->Import('kernel32', 'HGLOBAL  GlobalFree( HGLOBAL hMem )') or die;
Win32::API->Import('user32', 'BOOL   OpenClipboard( HWND hWndNewOwner )') or die;
Win32::API->Import('user32', 'HANDLE SetClipboardData( UINT uFormat, HANDLE hMem )') or die;
Win32::API->Import('user32', 'BOOL   CloseClipboard( )') or die;

# $out contient le texte de sortie, en UTF8

my $buffer = encode('UTF16LE', $out) . "\0\0";
my $alloc = GlobalAlloc(2, length $buffer);
my $lock = GlobalLock($alloc);
WriteMemory($lock, $buffer, length $buffer);
GlobalUnlock($alloc);
OpenClipboard(0);
SetClipboardData(13, $alloc);
CloseClipboard();

GlobalFree($alloc);



-
Edité par Chomp 2 mars 2018 à 1:00:57

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
2 mars 2018 à 18:08:40

Perl... Perso, je peux pas t'aider. Faut voir ça avec quelqu'un d'autre.
  • Partager sur Facebook
  • Partager sur Twitter
2 mars 2018 à 20:57:13

L'API Win32 doit être utilisable dans d'autres langages, je doute que le problème vienne de Perl. (Mais j'ai déjà fouillé la doc' https://msdn.microsoft.com/en-us/library/windows/desktop/ms649016(v=vs.85).aspx , c'est... Pas un truc qui se lit en cinq minutes, on va dire. Je suis même pas sûr du langage utilisé. C#, peut-être.)
  • Partager sur Facebook
  • Partager sur Twitter