Python – pywin32 bekommen Bitmap von Client-Bereich?

Ich versuche, das pywin32-Modul zu verwenden, um die Bitmap des Clientbereichs eines Fensters zu erhalten. Mit dem genauen Code aus dieser Frage bin ich in der Lage, die Bitmap des gesamten Desktops zu bekommen. Speziell, wenn ich mir die zurückgebrachten Bits anschaue, gibt es 4 * (Desktop-Pixel) Anzahl der Einträge. Allerdings, wenn ich versuche, etwas ähnliches für ein Fenster oder Client-Bereich zu tun, bekomme ich weniger Einträge zurückgegeben dann gibt es Pixel. Mein Code für das Erhalten der Fenster-Bitmap ist unten. Allerdings habe ich mehrere Variationen auf sie ausprobiert. Zum Beispiel, das Ersetzen der Fensterteile durch den Client-Bereich, Einstellung der (nXSrc, nYSrc) auf Null, etc. Irgendwelche Vorschläge, was ich falsch machen könnte? Vielen Dank!

Code:

  • Wie kann ich die Python-Imaging-Bibliothek verwenden, um eine Bitmap zu erstellen
  • Implementierung bestimmter Fälle in einer mathematischen zu wxbitmap Funktion
  • Python Win32API bitmap.GetBitmapBits ()
  • Wie kann ich Canvas-Inhalte in ein Bild konvertieren?
  • Wie fülle ich einen Teil einer Bitmap, die von einem schwarzen Rand mit meiner gewählten Farbe eingeschlossen ist?
  • Pygame auf Mac-Fehler mit Lade-Bilder
  • windowName = "MyProcessWindow" windowHandle = win32ui.FindWindow(None, windowName).GetSafeHwnd() windowRectangle = win32gui.GetWindowRect(windowHandle) width = windowRectangle[2]-windowRectangle[0] height = windowRectangle[3]-windowRectangle[1] win32gui.SetForegroundWindow(windowHandle) windowDeviceContext = win32gui.GetWindowDC(windowHandle) deviceContextObject = win32ui.CreateDCFromHandle(windowDeviceContext) compatibleDeviceContext = deviceContextObject.CreateCompatibleDC() dataBitMap = win32ui.CreateBitmap() dataBitMap.CreateCompatibleBitmap(compatibleDeviceContext, width, height) compatibleDeviceContext.SelectObject(dataBitMap) compatibleDeviceContext.BitBlt((0,0), (width, height), deviceContextObject, (windowRectangle[0],windowRectangle[1]), win32con.SRCCOPY) info = dataBitMap.GetInfo() bits = dataBitMap.GetBitmapBits(False) print info print len(bits) print (width*height) 

    Ergebnisse drucken:

     {'bmType': 0, 'bmWidthBytes': 92, 'bmHeight': 526, 'bmBitsPixel': 1, 'bmPlanes': 1, 'bmWidth': 728} 48392 382928 

  • Python dict: get vs setdefault
  • Pythons "Re" -Modul funktioniert nicht?
  • Dynamic Filter ListView CBV in Django 1.7
  • SSL-Fehler auf Python-GET-Anfrage
  • Wie wird Python verwendet, um Webservices zu erstellen?
  • Serving alle REST-Anfragen über GET mit Tornado
  • One Solution collect form web for “Python – pywin32 bekommen Bitmap von Client-Bereich?”

    Ich denke, das Problem ist das:

     dataBitMap.CreateCompatibleBitmap(compatibleDeviceContext, width, height) 

    Sie wollen eine Bitmap erstellen, die mit der Quelle DC kompatibel ist, die die entsprechende Farbtiefe und andere Funktionen hat. Dann können Sie das in das Ziel-DC auswählen, das ihm die passende Farbtiefe, Größe und andere Funktionen verleiht.

    Stattdessen schaffen Sie eine, die mit dem Ziel DC kompatibel ist, was an dieser Stelle ein 1×1 Black & White DC ist, wie in den CreateCompatibleDC docs erklärt. Dann wählst du das in die Ziel-DC, so dass es genau so, wie es begann.

    Das ist, warum Sie am Ende mit einer Bitmap mit 1 Flugzeug von 1bpp.

    Sehen Sie sich das Capturing a Image Probe (in C, und schrecklich C an, aber hoffentlich können Sie es folgen) für ein Beispiel, wie es zu tun. Aber ich glaube, das ist der einzige Schritt, den du falsch machst.

    Python ist die beste Programmiersprache der Welt.