【问题标题】:Screen Capture Under Win7 of JOGL AppletJOGL小程序Win7下截屏
【发布时间】:2011-01-10 09:34:53
【问题描述】:

我正在尝试截取在 浏览器。小程序使用 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)  

【问题讨论】:

    标签: python gdi jogl


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 Ricket,但我正在尝试使其自动化。我使用过 Screengrab,但即便如此,网页中的小程序也会出现黑色区域​​。另外,我需要该方法独立于浏览器。
    【解决方案2】:

    这是一种在截屏前禁用 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)
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-19
          • 1970-01-01
          • 1970-01-01
          • 2010-12-03
          • 1970-01-01
          • 2011-11-04
          • 2011-01-04
          • 1970-01-01
          相关资源
          最近更新 更多