Automatiser la copie d'une sélection de texte

Résolu/Fermé
Signaler
Messages postés
16438
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2021
-
Messages postés
16438
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2021
-
Bonjour,

Je cherche à faire un copier-coller d'un texte sur une console assez rustique. Pour cela on peut sélectionner un texte en restant appuyé sur la touche Shift et en se déplaçant avec les flèches, ensuite on peut faire la copie avec un Ctrl+C.

Je suis parti du côté de la classe Robot en Java. Pour le déplacement du curseur et le Ctrl+C ça fonctionne, mais je n'arrive pas à automatiser la combinaison Shift+flèche.

Voici un code de test :

import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.KeyEvent;

public class Test
{
    public static void main(String...args) throws Exception
    {
        // Initialisation
        
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();        
        Robot robot = new Robot();        
        System.out.println("5 secondes pour placer le curseur au début du texte");
        Thread.sleep(5000);
        
        // On maintient la touche Shift enfoncée
        
        robot.keyPress(KeyEvent.VK_SHIFT);
        
        // On déplace le curseur pour sélectionner la zone
        
        for (int x=1; x<10; x++)
        {
            robot.keyPress(KeyEvent.VK_RIGHT);
            robot.keyRelease(KeyEvent.VK_RIGHT);
        }
        
        for (int y=1; y<5; y++)
        {
            robot.keyPress(KeyEvent.VK_DOWN);
            robot.keyRelease(KeyEvent.VK_DOWN);
        }
        
        // On relâche la touche Shift
        
        robot.keyRelease(KeyEvent.VK_SHIFT);
        
        // Copier
        
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_C);
        robot.keyRelease(KeyEvent.VK_C);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        
        // Coller
        
        String str = clipboard.getContents(null).getTransferData(DataFlavor.stringFlavor) .toString();
        System.out.println(str);
    }
}

Si vous des idées pour régler ce problème (ou le contourner) je prends, sachant que bien sûr on ne peut pas tout faire sur ce genre de console.

Merci d'avance.

1 réponse

Messages postés
16438
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2021
2 918
Apparemment, ça ne peux fonctionner que si le verrouillage numérique est éteint, il suffirait donc de rajouter cette instruction au démarrage pour avoir la sélection :

Toolkit.getDefaultToolkit().setLockingKeyState(KeyEvent.VK_NUM_LOCK, false);
Par contre, je me rends compte que ma copie avec Ctrl+C ne fonctionne pas aussi bien que ce que je croyais... il va falloir que je la débogue aussi.
Messages postés
16438
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2021
2 918
En fait le Ctrl+C fonctionne bien mais il faut attendre un petit peu avant de le déclencher parce que la sélection ne se fait pas immédiatement après avoir relâché la touche Shift.

import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.KeyEvent;

public class Test
{
    public static void main(String...args) throws Exception
    {
        // Initialisation
        
    	Toolkit toolkit = Toolkit.getDefaultToolkit();
        Clipboard clipboard = toolkit.getSystemClipboard();
        Robot robot = new Robot();        
        System.out.println("5 secondes pour placer le curseur au début du texte");
        Thread.sleep(5000);
        
        toolkit.setLockingKeyState(KeyEvent.VK_NUM_LOCK, false);
        
        // On maintient la touche Shift enfoncée
        
        robot.keyPress(KeyEvent.VK_SHIFT);
        
        // On déplace le curseur pour sélectionner la zone
        
        for (int x=1; x<10; x++)
        {
            robot.keyPress(KeyEvent.VK_RIGHT);
            robot.keyRelease(KeyEvent.VK_RIGHT);
        }
        
        for (int y=1; y<5; y++)
        {
            robot.keyPress(KeyEvent.VK_DOWN);
            robot.keyRelease(KeyEvent.VK_DOWN);
        }
        
        // On relâche la touche Shift
        
        robot.keyRelease(KeyEvent.VK_SHIFT);
        
        // Copier
        
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_C);
        robot.keyRelease(KeyEvent.VK_C);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        
        Thread.sleep(100);
        
        // Coller
        
        String str = clipboard.getContents(null).getTransferData(DataFlavor. stringFlavor).toString();
        System.out.println(str);
    }
}
Messages postés
16438
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2021
2 918
Note importante : l'objet Clipboard change à chaque fois, il ne faut donc pas le déclarer une seule fois comme je l'ai fais avec Clipboard clipboard = toolkit.getSystemClipboard(); mais faire l'appel complet à chaque fois qu'on a fait une nouvelle copie.

String str = toolkit.getSystemClipboard().getContents(null).getTransferData( DataFlavor.stringFlavor).toString();