soma0sd

코딩 & 과학 & 교육

pywin32: GetWindowRect의 크기가 실제보다 작을 때

반응형

pywin32를 사용해서 윈도우의 핸들을 얻어 캡쳐를 하고자 할 때 캡쳐 범위를 지정하기 위해 디바이스에서 창이 그리는 사각형을 출력하는 win32.win32gui.GetWindowRect(hwnd)win32.win32gui.GetWindowRect(hwnd)를 사용하게 됩니다.

def get_window_rect(hwnd):
    return win32gui.GetWindowRect(hwnd)

그러나 이 값을 이용해서 캡쳐를 해보면 창의 일부가 잘리는 것을 볼 수 있습니다.

잘린 상태로 캡쳐한 모습

스택오버플로우(영문)에서 찾아보니 윈도우 7 이후 그래픽 인터페이스 구현이 달라지는 바람에 벌어지는 일이라고 합니다. 췬도우의 실제 크기보다 작게 인식하는 바람에 생긴 문제인데요. spy++등을 이용하여 해당 값을 알고 있다면 해당하는 값을 하드코딩하여 확인해볼 수 있습니다.

혹은 아래와 같은 방식으로 같은 기능을 하는 함수를 만들 수 있습니다.

from ctypes import windll, wintypes, byref, sizeof

def get_window_rect(hwnd):
    """ 핸들에 대응하는 윈도우의 좌표정보를 반환한다
    param:
        <int> hwnd: 윈도우 핸들
    return:
        <tuple> x1, y1, x2, y2
    """
    f = windll.dwmapi.DwmGetWindowAttribute
    rect = wintypes.RECT()
    DWMWA_EXTENDED_FRAME_BOUNDS = 9
    f(wintypes.HWND(hwnd),
      wintypes.DWORD(DWMWA_EXTENDED_FRAME_BOUNDS),
      byref(rect),
      sizeof(rect)
      )
    return rect.left, rect.top, rect.right, rect.bottom

창의 크기를 제대로 적용한 모습

반응형
태그:

댓글

End of content

No more pages to load