Я создаю модуль скриншотов, используя только чистый python (ctypes), не большой lib, такой как win32, wx, QT, ... Он должен управлять несколькими экранами (что PIL и Pillow не могут).Скриншот [ctypes.windll CreateDCFromHandle]
Где я блокируюсь при вызове CreateDCFromHandle, ctypes.windll.gdi32 не знает эту функцию. Я посмотрел на исходный код win32, чтобы быть вдохновленным, но бесполезным. Как сказано в комментарии, эта функция не существует в MSDN, поэтому какие изменения следует применять, чтобы принимать во внимание другие экраны?
Это код, который работает для основного монитора, но не для других: source code. Он блокируется на линии 35. Я пробовал много комбинаций, ища ответы здесь и на других сайтах. Но ничего функционального для меня ... Это всего лишь скриншот!
У вас есть ключи?
Заранее спасибо :)
Edit, я нашел mystake! Это код, который работает:
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.
французская статья с полными объяснениями: Windows : capture d'écran
MSDN, похоже, не знает этой функции. – icktoofay
Правильно, после всех выполненных запросов эта функция всегда присутствует в источнике кода, но не в MSDN. Где я могу применить изменения, чтобы принимать во внимание другие экраны? –
Хм нет, я не использую argtypes. Этот код работает с 64-битной версией Windows 7. Должен ли я использовать argtypes, если я не объявляю функции? –