0

我正在尝试使用 pywin32 模块来获取窗口客户区的位图。使用这个问题的确切代码,我可以获得整个桌面的位图。具体来说,当我查看返回的位时,有 4*(desktop-pixels) 条目数。但是,当我尝试为窗口或客户区做类似的事情时,我得到的返回条目比像素少。我获取窗口位图的代码如下。但是,我已经尝试了几种变体。例如,用客户区替换窗口部件,将 (nXSrc, nYSrc) 设置为零等。关于我可能做错的任何建议?非常感谢!

代码:

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)

打印结果:

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

1 回答 1

1

我认为问题是这样的:

dataBitMap.CreateCompatibleBitmap(compatibleDeviceContext, width, height)

您想要创建与DC 兼容的位图,该位图具有适当的颜色深度和其他功能。然后您可以将其选择到目标 DC 中,这将为其提供适当的颜色深度、大小和其他功能。

相反,您正在创建一个与目标DC兼容的DC,此时目标 DC 是 1x1 黑白 DC,如CreateCompatibleDC文档中所述。然后您将其选择到目标 DC 中,使其与开始时完全相同。

这就是为什么你最终得到一个具有 1 个 1bpp 平面的位图。

有关如何执行此操作的示例,请参阅捕获图像示例(在 C 中,以及可怕的 C,但希望您可以遵循它)。但我相信这是你做错的唯一一步。

于 2013-11-15T01:20:13.173 回答