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
3 Réponses :
Utiliser Voici un exemple: p> code initialement volé de java.awt.robot.createscreenCapture () code>.
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.
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. strong> p> à 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: p> 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. P> 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. P> sur XP et non-exécutant des machines DWM, vous êtes bloqué avec le code que je vous ai donné. P> En outre, vous pouvez jeter un coup d'œil à la question suivante:
Link Texte P> 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. p> eDitedit strong>
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? P> EDITITEDITEDIT FORT>
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: p> http: // code.google.com/p/jmemoryeditorw/ p> Vous remarquerez peut-être que si vous exécutez le programme, cela vous donnera tous les processus et ... leurs icônes. acclamations et je dois dire une très belle question. P> < / p>
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>
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); code>
Y a-t-il une raison pour laquelle vous n'utilisez pas gdi32extra.instance code> 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.