Creer une BufferedImage sur la fenêtre active

6FoursPlaya -  
KX Messages postés 19031 Statut Modérateur -
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

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
    1. 6FoursPlaya
       
      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
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      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