发布
社区首页 >问答首页 >截图[ctypes.windll CreateDCFromHandle]

截图[ctypes.windll CreateDCFromHandle]
EN

Stack Overflow用户
提问于 2013-06-30 20:45:38
回答 3查看 3.6K关注 0票数 2

我只使用纯python (Ctype)创建了一个屏幕截图模块,没有像win32、wx、QT这样的大库。它必须管理多屏幕( PIL和Pillow所不能做到的)。

当我调用CreateDCFromHandle时,ctypes.windll.gdi32不知道这个函数。我看了一下win32源代码,得到了启发,但没有用。正如注释中所述,MSDN中不存在此功能,因此我应该应用哪些更改来考虑其他屏幕?

这是为主监视器工作的代码,但不适用于其他监视器:源代码。它在35线被挡住了。我尝试了很多组合,在这里和其他网站上寻找答案。但对我来说没有什么用处..。这只是个截图!

你有线索吗?

(预先谢谢:)

编辑,我找到我的蛋糕了!这是工作的代码:

代码语言:javascript
代码运行次数:0
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-05 15:59:51

编辑,我找到我的蛋糕了!这是工作的代码:

代码语言:javascript
代码运行次数:0
复制
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.
票数 2
EN

Stack Overflow用户

发布于 2013-06-30 21:00:38

看看来源 for pywin32CreateDCFromHandle是一个捏造的东西。它不存在于Windows中;它只是将Windows转换为pywin32的桥梁。

由于您使用的是ctypes而不是pywin32,所以不需要进行转换;看看是否可以跳过这一步:

代码语言:javascript
代码运行次数:0
复制
hwin = user.GetDesktopWindow()
hwindc = user.GetWindowDC(monitor['hmon'])
memdc = gdi.CreateCompatibleDC(hwindc)

当您试图使用Python中的ctypes做一些本机Windows时,我发现查看已经使用Windows的现有C代码,而不是使用使用包装器的Python代码更有帮助。

票数 1
EN

Stack Overflow用户

发布于 2013-06-30 21:01:19

这不是Windows函数。您将需要EnumDisplayDevicesCreateDC的组合。请注意,您必须将"A“或"W”附加到函数的名称中,这取决于您是否要使用ANSI字符串或Unicode (widechar)字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17394685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档