Захватить все окно с WinAPI

Я использую winapi для захвата окна открытых программных приложений на Java. Эта функция ниже захватывает окно программного приложения и возвращает изображение.

public static BufferedImage capture(HWND hWnd) {
   HDC hdcWindow = User32.INSTANCE.GetDC(hWnd);
   HDC hdcMemDC = GDI32.INSTANCE.CreateCompatibleDC(hdcWindow);
   RECT bounds = new RECT();
   RECT bounds1 = new RECT();
   User32Extra.INSTANCE.GetWindowRect(hWnd, bounds);
   User32Extra.INSTANCE.GetClientRect(hWnd, bounds1);

   int extraGap = (bounds.right-bounds.left-bounds1.right);
   int width = bounds.right-bounds.left-extraGap;
   int height = bounds.bottom-bounds.top-extraGap ;
   HBITMAP hBitmap = GDI32.INSTANCE.CreateCompatibleBitmap(hdcWindow, width, height);

   HANDLE hOld = GDI32.INSTANCE.SelectObject(hdcMemDC, hBitmap);
   GDI32Extra.INSTANCE.BitBlt(hdcMemDC,0, 0, width, height, hdcWindow, bounds.left+bounds1.right-bounds.right+extraGap, bounds.top+bounds1.bottom-bounds.bottom+extraGap, WinGDIExtra.MERGECOPY);
   GDI32.INSTANCE.SelectObject(hdcMemDC, hOld);

   BITMAPINFO bmi = new BITMAPINFO();
   bmi.bmiHeader.biWidth = width;
   bmi.bmiHeader.biHeight = -height;
   bmi.bmiHeader.biPlanes = 1;
   bmi.bmiHeader.biBitCount = 32;
   bmi.bmiHeader.biCompression = WinGDI.BI_RGB;
   Memory buffer = new Memory(width * height * 4);
   GDI32.INSTANCE.GetDIBits(hdcWindow, hBitmap, 0, height, buffer, bmi, WinGDI.DIB_RGB_COLORS);

   BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
   image.setRGB(0, 0, width, height, buffer.getIntArray(0, width * height), 0, width);

   System.out.println(GDI32.INSTANCE.DeleteObject(hBitmap));
   System.out.println(GDI32.INSTANCE.DeleteObject(hdcMemDC));
   System.out.println(User32.INSTANCE.ReleaseDC(hWnd, hdcWindow));

   return image;
} 

Захваченное изображение имеет некоторые ошибки, такие как:-

  1. Это изображение окна Flash Builder с панелью заголовка Eclipse.

    Изображение Flash Builder со строкой заголовка Eclipse

  2. Это изображение браузера Chrome без оконных кнопок.

    Хромированное окно без оконных кнопок

  3. Это изображение файлового браузера с заголовком Eclipse.

    Окно браузера файлов с

  4. Иногда строка заголовка не фиксируется на изображении.

У вас есть идеи, почему и как я мог решить эту проблему? Что-то не так в моем коде?

0 ответов

Другие вопросы по тегам