簡體   English   中英

JNA截圖游戲

[英]JNA screenshot game

需要制作一些游戲的截圖。 找到了這個 JNA 代碼,但是當我嘗試執行 screen 時,我只會得到黑屏。 當我嘗試對某些程序(例如 WordPad 或 smth)進行屏幕顯示時,它運行良好。 我在 JNA 方面也很糟糕,我想向您尋求幫助。 有可能完成這個任務嗎?

public class Paint extends JFrame {
public BufferedImage capture(HWND hWnd) throws IOException {
    String gettime = Gettime.screentime();
    HDC hdcWindow = User32.INSTANCE.GetDC(hWnd);
    HDC hdcMemDC = GDI32.INSTANCE.CreateCompatibleDC(hdcWindow);
    RECT bounds = new RECT();
    User32Extra.INSTANCE.GetClientRect(hWnd, bounds);
    int width = bounds.right - bounds.left;
    int height = bounds.bottom - bounds.top;

    HBITMAP hBitmap = GDI32.INSTANCE.CreateCompatibleBitmap(hdcWindow, width, height);
    HANDLE hOld = GDI32.INSTANCE.SelectObject(hdcMemDC, hBitmap);
    GDI32Extra.INSTANCE.BitBlt(hdcMemDC, 0, 0, width, height, hdcWindow, 0, 0, WinGDIExtra.SRCCOPY);
    GDI32.INSTANCE.SelectObject(hdcMemDC, hOld);
    GDI32.INSTANCE.DeleteDC(hdcMemDC);
    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);
    GDI32.INSTANCE.DeleteObject(hBitmap);
    User32.INSTANCE.ReleaseDC(hWnd, hdcWindow);
    File outputfile = new File("C:\\image" +gettime+ ".jpg");
    ImageIO.write(image, "jpg", outputfile);
    return image;
}

public static void main(String[] args) throws IOException {

        new Paint();

}
BufferedImage image;

public Paint() throws IOException {
    HWND hWnd = User32.INSTANCE.FindWindow(null, "some game");
    this.image = capture(hWnd);

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();
    setExtendedState(MAXIMIZED_BOTH);
    setVisible(true);
}
@Override
public void paint(Graphics g) {
    super.paint(g);
    g.drawImage(image, 20, 40, null);
}
}

除了與平台無關之外,使用 JNA 截取屏幕截圖聽起來非常復雜。 Java 具有使用Robot類截取屏幕截圖的內置功能:

import java.awt.Robot;

Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = new Robot().createScreenCapture(screenRect);
ImageIO.write(capture, "png", new File("./screenshot.png"));

通過調整screenRect您還可以截取屏幕的一部分。

GDI32Util.getScreenshot(HWND hwnd)

jna 中已經提供了方法。

但是我的情況和你一樣....游戲畫面是黑的...沒什么...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM