2013-11-15 2 views
1

Я изучал использование пакета wx python в Windows 7. В частности, я хотел бы получить данные изображения из существующего окна (то есть не окно, открытое программой python). Кажется, я могу сделать это, получив контекст устройства окна, создав контекст совместимого устройства, скопировав растровое изображение, а затем используя его, как мне нравится. Проблема в том, что я не могу найти способ получить контекст устройства (или дескриптор) существующего окна. Я вижу только способы получить их из окон в программу python с помощью wx created. Как я могу это сделать? Спасибо много!wxPython - получить существующий windowDC/handle с помощью wx python module?

ответ

2

У wx, возможно, нет способа сделать это.

Windows API, которые вам нужны, довольно просты, и вы можете использовать их через win32api (или ctypes, если хотите, но это намного больше работы).

Во-первых, я не знаю, как вы планируете идентифицировать нужное окно. Если у вас есть свой класс и имя, вы можете просто FindWindow (или, если это может быть не окно верхнего уровня, FindWindowEx). Если вы хотите найти что-то еще, вам, вероятно, потребуется позвонить EnumWindow (плюс EnumChildWindows рекурсивно, если вы не уверены, что это окно верхнего уровня).

На этом этапе вы можете просто позвонить wx.Windows.AssociateHandle, чтобы прикрепить объект wx.Window к HWND.

Если вы не можете сделать это по какой-либо причине, GetDC дает контекст отображения для HWND. Затем вы можете создать DC памяти или получить DC для собственного окна под базовым окном wx и BitBlt от одного к другому.

+1

'AssociateHandle' действительно может быть использована для работы с окнами, созданных за пределами приложение Python. – FogleBird

+0

@FogleBird: Спасибо! Позвольте мне отредактировать ответ, потому что это упрощает работу. – abarnert

+0

Хорошо. Я думал, что это может быть так. Я пытался сделать то, что вы предлагаете, но столкнулся с проблемами, поскольку я [ищу в этом вопросе] (http://stackoverflow.com/questions/19980277/python-pywin32-getting-bitmap-of-client -площадь). Тем не менее, я не получал решения там, и у меня были проблемы с поиском этого самостоятельно. Это было, когда я нашел wx и подумал, что это может быть решение. – golmschenk

1

Просто расширить на другой ответ, попробуйте этот код (непроверенные, я не на 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) 
+0

Также ознакомьтесь с моим кодом здесь, который рисует снежинки на рабочем столе - вы также можете увидеть, как использовать ctypes для использования функции FindWindow. https://github.com/fogleman/wxSnow/blob/master/wxsnow.py – FogleBird