JOGL Applet Win7下的屏幕截图

时间:2010-01-28 12:28:58

标签: python gdi jogl

我正在尝试在一个内部运行的applet的屏幕截图 浏览器。 applet使用JOGL(OpenGL for Java)来显示3D 楷模。 (1)屏幕截图总是黑色或白色 当前的解决方案使用通常的GDI调用。小程序的屏幕截图不是 运行OpenGL很好 可在此处找到JOGL应用的一些示例https://jogl-demos.dev.java.net/ (2)我想要实现的另一件事是获得可滚动区域 屏幕内也是如此。

我在互联网上找到了这个代码,除了2之外,它的工作正常 上面提到的问题。

import win32gui as wg  
import win32ui as wu  
import win32con  

def copyBitMap(hWnd, fname):  
    wg.SetForegroundWindow(hWnd)  
    cWnd = wu.CreateWindowFromHandle(hWnd)  
    rect = cWnd.GetClientRect()  
    (x,y) = (rect[2] - rect[0], rect[3] - rect[1])  
    hsrccDc = wg.GetDC(hWnd)  
    hdestcDc = wg.CreateCompatibleDC(hsrccDc)  
    hdestcBm = wg.CreateCompatibleBitmap(hsrccDc, x, y)  
    wg.SelectObject(hdestcDc, hdestcBm.handle)  
    wg.BitBlt(hdestcDc, 0, 0, x, y, hsrccDc, rect[0], rect[1], win32con.SRCCOPY)  
    destcDc = wu.CreateDCFromHandle(hdestcDc)  
    bmp = wu.CreateBitmapFromHandle(hdestcBm.handle)  
    bmp.SaveBitmapFile(destcDc, fname)  

4 个答案:

答案 0 :(得分:0)

除非您尝试自动化,否则我会使用Firefox扩展程序。其中有一些是从a search for "screenshot"返回的,可以截取整个浏览器页面的屏幕截图,包括可滚动区域:

但是,我很抱歉,如果您确实尝试以编程方式执行此操作,我对Python调试您的具体问题并不了解。

答案 1 :(得分:0)

这是通过在拍摄屏幕截图之前禁用dwm(桌面窗口管理器)合成来实现此目的的一种方法,但这会导致整个屏幕在启用/禁用时闪烁。

from ctypes import WinDLL
from time import sleep  
import win32gui as wg  
import win32ui as wu  
import win32con  

def copyBitMap(hWnd, fname):  
    dwm = WinDLL("dwmapi.dll")
    dwm.DwmEnableComposition(0)

    wg.SetForegroundWindow(hWnd)
    # Give the window sometime to redraw itself
    sleep(2)
    cWnd = wu.CreateWindowFromHandle(hWnd)
    rect = cWnd.GetClientRect()
    (x,y) = (rect[2] - rect[0], rect[3] - rect[1])
    hsrccDc = wg.GetDC(hWnd)
    hdestcDc = wg.CreateCompatibleDC(hsrccDc)
    hdestcBm = wg.CreateCompatibleBitmap(hsrccDc, x, y)
    wg.SelectObject(hdestcDc, hdestcBm.handle)
    wg.BitBlt(hdestcDc, 0, 0, x, y, hsrccDc, rect[0], rect[1], win32con.SRCCOPY)
    destcDc = wu.CreateDCFromHandle(hdestcDc)
    bmp = wu.CreateBitmapFromHandle(hdestcBm.handle)
    bmp.SaveBitmapFile(destcDc, fname)

    dwm.DwmEnableComposition(1)

答案 2 :(得分:0)

在某些情况下,抓取OpenGL窗口可能会非常困难,因为OpenGL正由GPU直接渲染到其帧缓冲区中。这同样适用于DirectX窗口和视频叠加窗口。

答案 3 :(得分:0)

为什么不使用JOGL的Screenshot类? JOGL 2.0 beta中的com.jogamp.opengl.util.awt.Screenshot