栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java-窗口图片

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java-窗口图片

这是一个工作示例。

无法将捕获到的应用程序最小化,但不需要集中精力或放在顶部(即可见)。

相关C#线程,MSDN文章“ 捕获映像”和jmemoryeditorw中提供的代码提供了必要的部分。

该代码使用GetDC和GetClientRect捕获窗口的客户区。如果要捕获包括窗口装饰在内的整个窗口,可以将它们替换为GetWindowDC和GetWindowRect。

import java.awt.Graphics;import java.awt.image.BufferedImage;import javax.swing.Jframe;import jna.extra.GDI32Extra;import jna.extra.User32Extra;import jna.extra.WinGDIExtra;import com.sun.jna.Memory;import com.sun.jna.platform.win32.GDI32;import com.sun.jna.platform.win32.User32;import com.sun.jna.platform.win32.WinDef.HBITMAP;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.platform.win32.WinGDI;import com.sun.jna.platform.win32.WinGDI.BITMAPINFO;import com.sun.jna.platform.win32.WinNT.HANDLE;public class Paint extends Jframe {    public BufferedImage capture(HWND hWnd) {        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);        return image;    }    public static void main(String[] args) {        new Paint();    }    BufferedImage image;    public Paint() {        HWND hWnd = User32.INSTANCE.FindWindow(null, "Untitled - Notepad");        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);    }}

我必须定义一些不包含在platform.jar中的额外功能(可以在JNA网站上找到)。

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);}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496048.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号