我只使用纯python (Ctype)创建了一个屏幕截图模块,没有像win32、wx、QT这样的大库。它必须管理多屏幕( PIL和Pillow所不能做到的)。
当我调用CreateDCFromHandle时,ctypes.windll.gdi32不知道这个函数。我看了一下win32源代码,得到了启发,但没有用。正如注释中所述,MSDN中不存在此功能,因此我应该应用哪些更改来考虑其他屏幕?
这是为主监视器工作的代码,但不适用于其他监视器:源代码。它在35线被挡住了。我尝试了很多组合,在这里和其他网站上寻找答案。但对我来说没有什么用处..。这只是个截图!
你有线索吗?
(预先谢谢:)
编辑,我找到我的蛋糕了!这是工作的代码:
srcdc = ctypes.windll.user32.GetWindowDC(0)
memdc = ctypes.windll.gdi32.CreateCompatibleDC(srcdc)
bmp = ctypes.windll.gdi32.CreateCompatibleBitmap(srcdc, width, height)
ctypes.windll.gdi32.SelectObject(memdc, bmp)
ctypes.windll.gdi32.BitBlt(memdc, 0, 0, width, height, srcdc, left, top, SRCCOPY)
bmp_header = pack('LHHHH', calcsize('LHHHH'), width, height, 1, 24)
c_bmp_header = c_buffer(bmp_header)
c_bits = c_buffer(' ' * (height * ((width * 3 + 3) & -4)))
got_bits = ctypes.windll.gdi32.GetDIBits(memdc, bmp, 0, height,
c_bits, c_bmp_header, DIB_RGB_COLORS)
# Here, got_bits should be equal to height to tell you all goes well.
有完整解释的法语文章:窗口: capture d'écran
发布于 2016-09-05 15:59:51
编辑,我找到我的蛋糕了!这是工作的代码:
srcdc = ctypes.windll.user32.GetWindowDC(0)
memdc = ctypes.windll.gdi32.CreateCompatibleDC(srcdc)
bmp = ctypes.windll.gdi32.CreateCompatibleBitmap(srcdc, width, height)
ctypes.windll.gdi32.SelectObject(memdc, bmp)
ctypes.windll.gdi32.BitBlt(memdc, 0, 0, width, height, srcdc, left, top, SRCCOPY)
bmp_header = pack('LHHHH', calcsize('LHHHH'), width, height, 1, 24)
c_bmp_header = c_buffer(bmp_header)
c_bits = c_buffer(' ' * (height * ((width * 3 + 3) & -4)))
got_bits = ctypes.windll.gdi32.GetDIBits(
memdc, bmp, 0, height, c_bits, c_bmp_header, DIB_RGB_COLORS)
# Here, got_bits should be equal to height to tell you all goes well.
发布于 2013-06-30 21:00:38
看看来源 for pywin32
,CreateDCFromHandle
是一个捏造的东西。它不存在于Windows中;它只是将Windows转换为pywin32
的桥梁。
由于您使用的是ctypes
而不是pywin32
,所以不需要进行转换;看看是否可以跳过这一步:
hwin = user.GetDesktopWindow()
hwindc = user.GetWindowDC(monitor['hmon'])
memdc = gdi.CreateCompatibleDC(hwindc)
当您试图使用Python中的ctypes
做一些本机Windows时,我发现查看已经使用Windows的现有C代码,而不是使用使用包装器的Python代码更有帮助。
发布于 2013-06-30 21:01:19
这不是Windows函数。您将需要EnumDisplayDevices和CreateDC的组合。请注意,您必须将"A“或"W”附加到函数的名称中,这取决于您是否要使用ANSI字符串或Unicode (widechar)字符串。
https://stackoverflow.com/questions/17394685
复制相似问题