Я изучал использование пакета wx python в Windows 7. В частности, я хотел бы получить данные изображения из существующего окна (то есть не окно, открытое программой python). Кажется, я могу сделать это, получив контекст устройства окна, создав контекст совместимого устройства, скопировав растровое изображение, а затем используя его, как мне нравится. Проблема в том, что я не могу найти способ получить контекст устройства (или дескриптор) существующего окна. Я вижу только способы получить их из окон в программу python с помощью wx created. Как я могу это сделать? Спасибо много!wxPython - получить существующий windowDC/handle с помощью wx python module?
ответ
У wx, возможно, нет способа сделать это.
Windows API, которые вам нужны, довольно просты, и вы можете использовать их через win32api
(или ctypes
, если хотите, но это намного больше работы).
Во-первых, я не знаю, как вы планируете идентифицировать нужное окно. Если у вас есть свой класс и имя, вы можете просто FindWindow
(или, если это может быть не окно верхнего уровня, FindWindowEx
). Если вы хотите найти что-то еще, вам, вероятно, потребуется позвонить EnumWindow
(плюс EnumChildWindows
рекурсивно, если вы не уверены, что это окно верхнего уровня).
На этом этапе вы можете просто позвонить wx.Windows.AssociateHandle
, чтобы прикрепить объект wx.Window
к HWND.
Если вы не можете сделать это по какой-либо причине, GetDC
дает контекст отображения для HWND. Затем вы можете создать DC памяти или получить DC для собственного окна под базовым окном wx и BitBlt
от одного к другому.
Просто расширить на другой ответ, попробуйте этот код (непроверенные, я не на Windows, прямо сейчас) ...
# first use FindWindow or FindWindowEx to determine window handle
frame = wx.Frame(None)
frame.AssociateHandle(handle)
dc = wx.ClientDC(frame)
width, height = dc.GetSize()
bitmap = wx.EmptyBitmap(width, height)
mdc = wx.MemoryDC(bitmap)
mdc.Blit(0, 0, width, height, dc, 0, 0)
del mdc
bitmap.SaveFile('output.png', wx.BITMAP_TYPE_PNG)
Также ознакомьтесь с моим кодом здесь, который рисует снежинки на рабочем столе - вы также можете увидеть, как использовать ctypes для использования функции FindWindow. https://github.com/fogleman/wxSnow/blob/master/wxsnow.py – FogleBird
'AssociateHandle' действительно может быть использована для работы с окнами, созданных за пределами приложение Python. – FogleBird
@FogleBird: Спасибо! Позвольте мне отредактировать ответ, потому что это упрощает работу. – abarnert
Хорошо. Я думал, что это может быть так. Я пытался сделать то, что вы предлагаете, но столкнулся с проблемами, поскольку я [ищу в этом вопросе] (http://stackoverflow.com/questions/19980277/python-pywin32-getting-bitmap-of-client -площадь). Тем не менее, я не получал решения там, и у меня были проблемы с поиском этого самостоятельно. Это было, когда я нашел wx и подумал, что это может быть решение. – golmschenk