¿Alguien sabe cómo capturar una captura de pantalla en Java (no es pantalla propia, pero cualquier otra ventana en el escritorio y que hacer no necesariamente tiene que ser el activa ventana) en Windows ? Aquí hay varios temas sobre este tema similar, pero aún no he encontrado una respuesta.Java - ventana de la imagen
He intentado usar JNA, pero se atascó después de algunos intentos. Por ejemplo ...
public class Main {
public static void main(String[] args) {
Main m = new Main();
List<WindowInfo> list = m.getWindows();
for (int i=0;i<list.size();i++)
{
WindowInfo info = list.get(i);
System.out.println(info.getTitle());
}
WindowInfo wi = list.get(0);
W32API.HDC hdcSrc = User32.instance.GetWindowDC(wi.getHwnd());
W32API.HDC hdcMemory = Gdi32.instance.CreateCompatibleDC(hdcSrc);
//W32API.HBITMAP hBitmapMemory = Gdi32.instance.CreateCompatibleBitmap(hdcSrc, int width, int height);
int width = wi.getRect().right - wi.getRect().left;
int height = wi.getRect().bottom - wi.getRect().top;
W32API.HBITMAP hBitmapMemory = Gdi32.instance.CreateCompatibleBitmap(hdcSrc, width, height);
W32API.HANDLE hOld = Gdi32.instance.SelectObject(hdcMemory, hBitmapMemory);
Gdi32.instance.BitBlt(hdcMemory, 0, 0, width, height, hdcSrc, width+2, height+2, 0x00CC0020);
/* # now how do we convert to a BufferedImage??? */
// clean up
Gdi32.instance.SelectObject(hdcMemory, hOld);
Gdi32.instance.DeleteDC(hdcMemory);
Gdi32.instance.DeleteObject(hBitmapMemory);
User32.instance.ReleaseDC(wi.getHwnd(), hdcSrc);
}
/**
*
* @return
*/
private List<WindowInfo> getWindows() {
final List<WindowInfo> list = new ArrayList<WindowInfo>();
User32.instance.EnumWindows(new WndEnumProc() {
public boolean callback(int hWnd, int lParam) {
if (User32.instance.IsWindowVisible(hWnd)) {
RECT r = new RECT();
User32.instance.GetWindowRect(hWnd, r);
byte[] buffer = new byte[1024];
User32.instance.GetWindowTextA(hWnd, buffer, buffer.length);
String title = Native.toString(buffer);
if (title!=null&&title.length()>0) {
list.add(new WindowInfo(hWnd, r, title));
}
}
return true;
}
}, 0);
Collections.sort(list, new Comparator<WindowInfo>() {
public int compare(WindowInfo o1, WindowInfo o2) {
int i1 = (o1.getTitle()!=null&&o1.getTitle().length()>0?o1.getTitle():" ").charAt(0);
int i2 = (o2.getTitle()!=null&&o2.getTitle().length()>0?o2.getTitle():" ").charAt(0);
return i1 - i2;
}
});
return list;
}
También he probado el equivalente de "PrintWindow) (" API ...
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
O tengo que usar JNI, o cualquier otra herramienta?
Gracias de antemano ...
muy agradable ... gran respuesta! ¡Gracias! – rog8gm
¿crees que puedes explicar cómo funciona la clase HDC? Intenté hacer un programa smilar antes de poder contener un montón de instancias de HDC y luego convertirlas a una imagen de buffer, lo que me pregunta es dónde se almacena la información de HDC – user4090
Esto lo hace un poco más rápido: 'BufferedImage image = new BufferedImage (ancho, alto, BufferedImage.TYPE_INT_RGB); MemoryImageSource source = new MemoryImageSource (ancho, alto, buffer.getIntArray (0, ancho * alto), 0, ancho); image.getGraphics(). DrawImage (Toolkit.getDefaultToolkit(). CreateImage (origen), 0, 0, nulo); ' – onkelv