Automatiser la copie d'une sélection de texte

Résolu/Fermé
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 12 avril 2013 à 21:23
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 14 avril 2013 à 15:49
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.
A voir également:

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 avril 2013 à 22:54
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.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
13 avril 2013 à 12:04
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);
    }
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
14 avril 2013 à 15:49
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();
0