10
votes

Java - image de fenêtre

Est-ce que quelqu'un sait-on capturer un coup d'écran en Java (pas son propre écran, mais une autre fenêtre sur le bureau et ils ne doivent pas nécessairement être le forte> fenêtre) dans Windows? Il existe un certain nombre de threads sur ce sujet similaire, mais je n'ai pas encore trouvé de réponse.

J'ai essayé d'utiliser la JNA, mais je suis resté coincé après quelques tentatives. Par exemple ... P>

Graphics g = form.CreateGraphics();
Bitmap bmp = new Bitmap(form.Size.Width, form.Size.Height, g);
Graphics memoryGraphics = Graphics.FromImage(bmp);
IntPtr dc = memoryGraphics.GetHdc();
bool success = PrintWindow(form.Handle, dc, 0);
memoryGraphics.ReleaseHdc(dc);
// bmp now contains the screenshot


0 commentaires

3 Réponses :


4
votes

Utiliser java.awt.robot.createscreenCapture () .

Voici un exemple: xxx

code initialement volé de ici .


2 commentaires

Cela ne fonctionnerait pas pour Windows en arrière-plan alors que dans une solution.


Cette méthodologie ne fonctionne pas trop bien lorsqu'une fenêtre de notification apparaît sur le rectangle de capture.



4
votes

Pour votre question originale, cela va ici.

Capturer une fenêtre inactive sous Windows est assez simple, à l'aide de la classe de robot, uniquement et uniquement si la fenêtre est visible au moment de la capture. Si vous voulez éviter cette exigence, vous devez utiliser l'API DWM.

à l'aide de l'API Windows normal (PRE VISTA), vous pouvez utiliser getWindowrect (poignée, record) où La poignée est un gestionnaire à la fenêtre que vous souhaitez capturer. Cela vous obtiendra un objet record (je suppose que vous utilisez JNA), voici la séquence de code que vous devriez écrire: xxx

Cependant !! Cela fonctionnera comme un charme uniquement si votre fenêtre est actuellement visible. S'il est minimisé, vous obtiendrez une exception à Java (car il a des x et y négatifs). Et si elle est partiellement masquée, vous découvrirez également les autres fenêtres qui se trouvent sur le dessus.

Vous ne pouvez pas résoudre votre problème sur des boîtes qui n'ont pas de DWM (bureau Windows de bureau). A une API qui permet à différentes fenêtres d'écrire sur un tampon temporaire avant de ne pas être peint à l'écran.

sur XP et non-exécutant des machines DWM, vous êtes bloqué avec le code que je vous ai donné.

En outre, vous pouvez jeter un coup d'œil à la question suivante: Link Texte

edit:

Voici un guide intéressant (en C #, mais vous pouvez utiliser JNA + Java en appliquant les mêmes principes) qui vous donneront une meilleure compréhension de Le DWM et comment l'utiliser pour faire exactement ce que vous voulez.

texte de lien

eDitedit Il suffit de voir que vous avez un lien vers le même guide en C # que je vous ai donné. Ce qui semble être le problème en réécrivant le code de Java / JNA?

EDITITEDITEDIT Pour répondre à votre question supplémentaire (comment convertir votre bitbit en bufferedimage), voici un gars qui l'a fait dans son projet open source. C'est un bon travail et lui donner une certaine appréciation:

http: // code.google.com/p/jmemoryeditorw/

Vous remarquerez peut-être que si vous exécutez le programme, cela vous donnera tous les processus et ... leurs icônes. Si vous creusez dans le code, vous verrez comment ils sont convertis de Bitbit en bufferedimages.

acclamations et je dois dire une très belle question. < / p>


0 commentaires

16
votes

Voici un exemple de travail.

L'application étant capturée ne peut pas être minimisée, mais il n'a pas besoin de se concentrer ou d'être sur le dessus (c'est-à-dire visible). P>

Le code fourni dans le Filetage C # associé, article MSDN capture d'une image A> et JMemoryEditorW a fourni les pièces nécessaires. P>

Le code utilise GetDC et GetClientRect pour capturer la zone client de la fenêtre. Ils peuvent être remplacés par GewindowdC et GetWindowRect Si vous souhaitez capturer la fenêtre entière, y compris les décorations de fenêtre. P>

package jna.extra;

import com.sun.jna.Native;
import com.sun.jna.platform.win32.GDI32;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinDef.HDC;
import com.sun.jna.win32.W32APIOptions;

public interface GDI32Extra extends GDI32 {

    GDI32Extra INSTANCE = (GDI32Extra) Native.loadLibrary("gdi32", GDI32Extra.class, W32APIOptions.DEFAULT_OPTIONS);

    public boolean BitBlt(HDC hObject, int nXDest, int nYDest, int nWidth, int nHeight, HDC hObjectSource, int nXSrc, int nYSrc, DWORD dwRop);

}



package jna.extra;

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

public interface User32Extra extends User32 {

    User32Extra INSTANCE = (User32Extra) Native.loadLibrary("user32", User32Extra.class, W32APIOptions.DEFAULT_OPTIONS);

    public HDC GetWindowDC(HWND hWnd);

    public boolean GetClientRect(HWND hWnd, RECT rect);

}



package jna.extra;

import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinGDI;

public interface WinGDIExtra extends WinGDI {

    public DWORD SRCCOPY = new DWORD(0x00CC0020);

}


5 commentaires

Hey Pensez-vous que vous pouvez expliquer comment fonctionne la classe HDC? J'ai essayé de faire un programme smilaire avant d'accéder à un tas d'instances de HDC, puis de les convertir en une image bufferd, qu'est-ce que je me demande est où les informations HDC sont stockées


Cela en fait un peu plus vite: bufferedimage image = nouveau buffereDimage (largeur, hauteur, bufferedimage.type_int_rgb); MemorysImagesource Source = Nouveau MemieMagesource (largeur, hauteur, tampon.getintarray (0, largeur * hauteur), 0, largeur); image.getgraphics (). Drawimage (Toolkit.getDeFaultToolk it (). CreateImage (SOU RCE), 0 , 0, null);


Y a-t-il une raison pour laquelle vous n'utilisez pas gdi32extra.instance pour toutes les méthodes GDI32?


C'était un moment depuis que j'ai écrit cela donc je ne me souviens pas malheureusement. Essayez-le et laissez-moi savoir.


Cela ne fonctionne que sur Windows 7 avec Aero sur, sinon vous obtenez l'image de tout ce qui couvre votre fenêtre.