Снимок экрана под Win7 апплета JOGL - PullRequest
2 голосов
/ 28 января 2010

Я пытаюсь сделать снимок экрана апплета, работающего внутри браузер. Апплет использует JOGL (OpenGL для 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 голосов
/ 06 декабря 2010

Почему бы не использовать класс Screenshot в JOGL ?? com.jogamp.opengl.util.awt. Снимок экрана в бета-версии JOGL 2.0

0 голосов
/ 17 февраля 2010

Вот один из способов сделать это, отключив композицию dwm (Desktop Window Manager) перед тем, как делать снимок экрана, но это заставляет весь экран мигать, когда он включен / отключен.

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 голосов
/ 03 апреля 2010

В некоторых случаях захват окна OpenGL может быть довольно сложным, так как OpenGL визуализируется графическим процессором непосредственно в буфер кадров. То же самое относится к окнам DirectX и окнам наложения видео.

0 голосов
/ 05 февраля 2010

Если вы не пытаетесь автоматизировать это, я бы просто использовал для этого расширение Firefox. Есть несколько из них, возвращенных из поиска «скриншот» , который может сделать снимок экрана всей страницы браузера, включая прокручиваемую область:

Однако, я прошу прощения, я не знаю достаточно о Python, чтобы отладить вашу конкретную проблему, если вы действительно пытаетесь сделать это программным путем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...