2016-03-27 6 views
0

ich in Python 2.7.11 unter Windows 7.Screenshots nicht alle Fenster in Python Screenshot zeigen Imagegrab

def takeScreenshot(filename,directories,allConfigs): 
    im = pyautogui.screenshot() 
    im.save(os.path.join(directories['picsdir'],filename)) 

einen sehr einfachen Code verwenden Wenn ich diese Funktion, dauert es einen Screenshot des gesamten Bildschirms außer die Anwendung, die ich wirklich will, ist Samsung Sidesync. Wenn ich diesen Code benutze, zeigt er mir den ganzen Bildschirm an, aber es ist so, als wäre das Samsung-Side-Sync-Fenster im Screenshot verschwunden.

Aber wenn ich einen Druck-Bildschirm über die Tastatur-Taste und speichern in eine Datei, ist es da und ich kann es sehen.

Ich verstehe nicht, warum das Verhalten anders sein sollte.

Antwort

1

Warum dies der Fall ist, ist der wahrscheinlichste Grund dafür, dass Samsung Sidesync DirectX/OpenGL/LayeredGraphics verwendet, um das Bildschirmbild Ihres Telefons zu rendern.

Das ist der Grund, warum die meisten Benutzer-Pace-Anwendungen nicht aufzeichnen können, was auf Ihrem Monitor angezeigt wird, da diese grafische Rendering-Instanz außerhalb Ihres Anwendungsbereichs liegt (versuchen Sie, GL-Grafiken zu rendern und einen Thread innerhalb Ihres eigenen Codes zu haben) update traurige GL-Instanz und du wirst meinen Punkt hier bekommen).

Jetzt ist Ihre Bibliothek ist nur eine Abstraktion des folgenden Codes:

from PIL import ImageGrab 
screenshot = ImageGrab.grab() 
screenshot.save('wham.png') 

Jetzt sind die following code Haken in Windows-System-Bibliotheken, die in Systemraum leben sollten und damit mehr Zugang haben Ihre überlappenden Fenstern zu greifen:

import win32gui 
import win32ui 
hwnd = win32gui.FindWindow(None, windowname) 
wDC = win32gui.GetWindowDC(hwnd) 
dcObj=win32ui.CreateDCFromHandle(wDC) 
cDC=dcObj.CreateCompatibleDC() 
dataBitMap = win32ui.CreateBitmap() 
dataBitMap.CreateCompatibleBitmap(dcObj, w, h) 
cDC.SelectObject(dataBitMap) 
cDC.BitBlt((0,0),(w, h) , dcObj, (0,0), win32con.SRCCOPY) 
dataBitMap.SaveBitmapFile(cDC, bmpfilenamename) 
# Free Resources 
dcObj.DeleteDC() 
cDC.DeleteDC() 
win32gui.ReleaseDC(hwnd, wDC) 
win32gui.DeleteObject(dataBitMap.GetHandle()) 
Verwandte Themen