2010-01-28 73 views
2

我試圖拍攝一個在 瀏覽器中運行的小程序的屏幕截圖。該applet使用JOGL(OpenGL for Java)來顯示3D 模型。 (1)屏幕截圖總是出現黑色或白色。當前的解決方案使用通常的GDI調用。運行OpenGL的applet不是 的屏幕截圖很好。
JOGL應用程序的幾個例子可以在這裏找到https://jogl-demos.dev.java.net/ (2)我試圖實現的另一件事是讓屏幕截圖中的滾動區域 以及。JOGL Applet的Win7下的屏幕截圖

我在互聯網上發現了這個代碼,除了上面提到的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) 
+0

嗨,你解決了嗎? – elect 2015-08-07 13:31:37

回答

0

除非您嘗試將其自動化,否則我只需使用Firefox擴展即可。有許多人從a search for "screenshot"返回,可以採取整個瀏覽器頁面的截圖,包括滾動區域:

但是,我很抱歉,如果您確實試圖通過編程的方式進行操作,我不太瞭解Python以調試您的特定問題。

+0

感謝Ricket,但我試圖自動化它。我已經使用了Screengrab,但即使在網頁上出現了小程序的黑色區域。另外我需要該方法是獨立於瀏覽器的。 – binarybug 2010-02-05 10:34:28

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) 
0

在某些情況下,抓取OpenGL窗口可能相當困難,因爲OpenGL是由GPU直接渲染到其幀緩衝區中的。這同樣適用於DirectX窗口和視頻疊加窗口。

0

爲什麼不使用JOGL的Screenshot類? com.jogamp.opengl.util.awt.Screenshot in JOGL 2.0 beta