Creer une BufferedImage sur la fenêtre active

Fermé
6FoursPlaya - 14 févr. 2014 à 22:43
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 15 févr. 2014 à 12:50
Bonjour,



tout est plus ou moins dit... Je cherche à créer avec un robot (ou autre solution) une bufferedImage sur ma fenêtre active de mon écran (et non pas de tout l'écran)...
Merci par avance de votre aide

Cordialement,
Greg
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
15 févr. 2014 à 11:25
L'idée du Robot est pas mal, il faut juste lui indiquer de ne prendre que la portion d'écran qui correspond à la fenêtre active. Exemple :

import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Test
{
    public static void main(String[] args)
    {
        final JFrame frame = new JFrame();
        
        JButton button = new JButton("Capture");
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                try
                {
                    Robot robot = new Robot();
                    
                    Dimension size = frame.getSize();
                    Point pos = frame.getLocationOnScreen();
                    
                    BufferedImage img = robot.createScreenCapture(new Rectangle(pos.x, pos.y, size.width, size.height));
                    
                    File tmp = File.createTempFile("awtScreenCapture_", ".png");
                    ImageIO.write(img, "png", tmp);
                    
                    Desktop.getDesktop().open(tmp);
                }
                catch (Exception e)
                {
                    JOptionPane.showMessageDialog(frame, e, e.getClass().getCanonicalName(), JOptionPane.ERROR_MESSAGE);
                }
            }
        });
        
        frame.setSize(200, 200);
        frame.add(button);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
0
Bonjour KX,

merci de ta réponse mais cela ne correspond pas exactement à mon besoin...
Je ne veux pas créer de JFrame et faire une capture sur cette dernière mais par exemple faire une copie d'écran automatique (toutes les 3 sec) sur firefox ou sur un explorateur windows ou autre (la fenêtre qui est active sur mon écran de PC)
Merci par avance
Cdlt,
Greg
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 15/02/2014 à 13:22
Il n'y a rien de standard qui existe, c'est possible avec Java Native Access, mais le code dépendra du système d'exploitation que tu utilises.

Sous Windows tu peux faire comme ça :

import java.awt.Rectangle;

import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.RECT;

public class WindowsUtils
{
    private static class User32DLL
    {
        static { Native.register("user32"); }
        
        public static native HWND GetForegroundWindow();
        public static native boolean GetWindowRect(HWND hWnd, RECT lpRect);
    }
    
    public static Rectangle getActiveWindowPosition()
    {
        RECT rect = new RECT();
        User32DLL.GetWindowRect(User32DLL.GetForegroundWindow(),rect);
        return new Rectangle(rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top);
    }
}

Du coup tu adaptes le code de tout à l'heure comme ceci :

Thread.sleep(1000);// laisse 1 seconde pour choisir la bonne fenêtre
Rectangle rect = WindowsUtils.getActiveWindowPosition();
BufferedImage img = robot.createScreenCapture(rect);

Il faudra bien sûr rajouter les deux jar jna et jna-platform dans ton classpath pour que ça fonctionne.
0