2013-10-30 8 views
3

나는 "쓰기"를 관리하는 인터넷 검색의 시간 후에이에서 PrintWindow :파이썬 스크린 샷 + win32gui

import win32gui 
from ctypes import windll 

hwnd = win32gui.FindWindow(None, 'Steam') 

hdc = win32gui.GetDC(hwnd) 
hdcMem = win32gui.CreateCompatibleDC(hdc) 

hbitmap = win32ui.CreateBitmap() 
hbitmap = win32gui.CreateCompatibleBitmap(hdcMem, 500, 500) 

win32gui.SelectObject(hdcMem, hbitmap) 

windll.user32.PrintWindow(hwnd, hdcMem, 0) 

는 권리인가? 저장하는 방법?

미리 감사드립니다.

답변

9

다양한 검색 방법을 시도하고 다양한 방법을 시도한 결과, 다음 사항이 유용했습니다.

import win32gui 
import win32ui 
from ctypes import windll 
import Image 

hwnd = win32gui.FindWindow(None, 'Calculator') 

# Change the line below depending on whether you want the whole window 
# or just the client area. 
#left, top, right, bot = win32gui.GetClientRect(hwnd) 
left, top, right, bot = win32gui.GetWindowRect(hwnd) 
w = right - left 
h = bot - top 

hwndDC = win32gui.GetWindowDC(hwnd) 
mfcDC = win32ui.CreateDCFromHandle(hwndDC) 
saveDC = mfcDC.CreateCompatibleDC() 

saveBitMap = win32ui.CreateBitmap() 
saveBitMap.CreateCompatibleBitmap(mfcDC, w, h) 

saveDC.SelectObject(saveBitMap) 

# Change the line below depending on whether you want the whole window 
# or just the client area. 
#result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 1) 
result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 0) 
print result 

bmpinfo = saveBitMap.GetInfo() 
bmpstr = saveBitMap.GetBitmapBits(True) 

im = Image.frombuffer(
    'RGB', 
    (bmpinfo['bmWidth'], bmpinfo['bmHeight']), 
    bmpstr, 'raw', 'BGRX', 0, 1) 

win32gui.DeleteObject(saveBitMap.GetHandle()) 
saveDC.DeleteDC() 
mfcDC.DeleteDC() 
win32gui.ReleaseDC(hwnd, hwndDC) 

if result == 1: 
    #PrintWindow Succeeded 
    im.save("test.png") 
+1

좋은 답변! 지난 두 시간 동안 파이썬에 정확히 동일한 C++ 코드를 이식하려고했지만 낭비했다. 각 라인이하는 일에 대해 더 자세히 설명해 주시겠습니까? – d34th4ck3r