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:

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 

  • Gibt es einen bekannten Win32 Tkinter Bug in Bezug auf die Anzeige von Fotos auf einer Leinwand?
  • Win32: Überprüfen Sie, ob das Fenster minimiert ist
  • Wie man die Tasten drücken, wenn das Konsolenfenster den Fokus verloren hat
  • Wie autorisieren / verweigern Schreibzugriff auf ein Verzeichnis auf Windows mit Python?
  • So starten Sie win32-Anwendungen in separaten Threads in Python
  • Erkennung von Windows-Logout in Python
  • Win32: Bewegen der Maus mit SetCursorPos vs. mouse_event
  • Wie kann man die Prozesspriorität mit pywin32 und WMI einstellen?
  • 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.