2013-11-15 34 views
1

我一直在研究在Windows 7上使用wx python包。具體來說,我希望能夠獲取現有窗口的圖像數據(即不是由python程序打開的窗口)。看起來我可以通過獲取窗口的設備上下文,創建兼容的設備上下文,複製位圖,然後使用它,從那裏獲得我喜歡的方式。問題是,我似乎無法找到獲取現有窗口的設備上下文(或句柄)的方式。我只能看到使用wx創建的方式從python程序的窗口中獲取它們。我該怎麼做才能做到這一點?非常感謝!wxPython - 使用wx python模塊獲取現有的windowDC /句柄?

回答

2

wx可能沒有辦法做到這一點。

您需要的Windows API非常簡單,您可以通過win32api(或​​,如果您願意,但這可以做更多工作)使用它們。

首先,我不知道你打算如何識別你想要的窗口。如果你有它的班級和名字,你可以只需FindWindow(或者,如果它不是頂級窗口,FindWindowEx)。如果您想通過其他方式進行搜索,則可能需要撥打EnumWindow(如果您不確定它是否是頂級窗口,則遞歸地加上EnumChildWindows)。

此時,您可以撥打wx.Windows.AssociateHandlewx.Window對象附加到HWND。

如果無論如何不能這樣做,GetDC會爲您提供HWND的顯示上下文。然後你可以創建一個內存DC,或者在你的wx窗口的底層獲取本地窗口的DC,並且從一個到另一個。

+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