2

我正在尝试截取在浏览器中运行的小程序的屏幕截图。该小程序使用 JOGL(用于 Java 的 OpenGL)来显示 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

4 回答 4

0

除非您尝试将其自动化,否则我只会为此使用 Firefox 扩展程序。有许多是从搜索“屏幕截图”中返回的,它们可以截取整个浏览器页面的屏幕截图,包括可滚动区域:

但是,我很抱歉,如果您确实尝试以编程方式进行调试,我对 Python 的了解还不够多,无法调试您的特定问题。

于 2010-02-04T22:12:21.073 回答
0

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

于 2010-12-06T14:37:46.020 回答
0

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

于 2010-04-03T08:51:26.310 回答
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)
于 2010-02-17T12:28:22.717 回答