3. [pywin32] Windows 관련 함수 - 2

pywin32/win32gui|2021. 1. 13. 00:59

어제 진행했던 1부에 계속 이어나가겠습니다

 

8. SendMessage(hwnd, idMessage, wParam, lParam)

 

윈도우에게 메시지를 보냅니다.

 

인자로는 hwnd : PyHANDLE, idMessage : int, wParam=None : int/string, lParam=None : int/string 가 있습니다.

 

hwnd: 윈도우의 핸들값입니다.

 

idMessage: 보낼 메시지 입니다. 사용자 정의 메시지도 가능합니다.

 

wParam: 메시지와 함께 보낼 데이터입니다.

 

lParam: 메시지와 함께 보낼 데이터입니다. (2)

 

 

9. AnimateWindow(hwnd, Time, Flags)

 

윈도우를 보여주거나 숨길 때 애니메이션 효과를 부여합니다.

 

인자로는 hwnd : PyHANDLE, Time : int, Flags : int 가 있습니다.

 

hwnd: 윈도우의 핸들값입니다.

 

Time: 애니메이션 효과 주기 시간입니다.(ms 단위)

 

Flags: 애니메이션 효과 플래그입니다.

 * 참조: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-animatewindow

 

 

 

10. boolean = ShowWindow(hWnd, cmdShow )

 

윈도우를 어떻게 보여줄지를 정하는 함수입니다.

 

인자로는 hWnd : int, cmdShow : int가 있습니다.

 

hWnd: 윈도우의 핸들값입니다.

 

cmdShow: 윈도우를 어떻게 보여줄지를 정하는 값입니다. win32con.SW_* 플래그를 사용합니다. 보통 win32con.SW_SHOWNORMAL을 많이 사용합니다.

 * 참조: docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow

 

리턴값은 boolean으로 이전에 윈도우가 볼 수 있는 상태라면 True, 아니면 False를 리턴합니다.

 

 

10. UpdateWindow(hwnd)

 

WM_PAINT 메시지를 날려서 윈도우 영역을 업데이트 시킵니다.

 

인자로는 hwnd : int 가 있습니다.

 

hwnd: 윈도우의 핸들값입니다.

 

 

11. MSG = GetMessage(hwnd, min , max )

 

메시지 큐에서 메시지를 검색해서 가져옵니다.

 

인자로는 hwnd : int, min : int, max : int 가 있습니다.

 

hwnd: 윈도우 핸들값입니다.

 

min: 검색해서 가져올 메시지의 최소값을 정합니다.

 

max: 검색해서 가져올 메시지의 최대값을 정합니다. min과 max가 둘다 0이라면 모든 메시지를 검색하고 가져옵니다.

 

리턴값은 MSG(=PyMSG)라고 되있는데 실제 사용하는 MSG와 와 형식이 좀 다르더군요... 그래서 예제에서는 MSG를 좀 변경했습니다.

일단 MSG 형식은 다음과 같습니다.

 

* MSG(=PyMSG)

[0] PyHANDLE : hwnd : 윈도우 핸들값입니다.

[1] int : message : GetMessage로 가져온 메시지의 식별자입니다.

[2] int : wParam : 메시지와 함께 가져온 부가 데이터입니다.

[3] int : lParam : 메시지와 함께 가져온 부가 데이터입니다. (2)

[4] int : time : 메시지가 게시된 시간입니다.

[5] (int, int) : point : 메시지가 게시될 때 마우스 커서의 위치입니다. (x,y 좌표)

 

 

12. int = TranslateMessage(msg)

 

가상 키 메시지를 실제 메시지로 번역해줍니다. 예를 들어 키를 눌렀다 뗐을 때 WM_KEYDOWN과 WM_KEYUP 메시지가 발생하는 데 TranslateMessage는 WM_CHAR 메시지를 추가로 생성한다.

 

인자로는 msg : MSG가 있습니다.

 

msg: 윈도우 메시지입니다.

 

리턴값은 int로 msg가 제대로 번역이 되지 않았다면 0을, 제대로 번역이 되거나, WM_KEYDOWN, WM_SYSKEYDOWN일 경우(번역과 상관없이) 0이 아닌 값을 리턴합니다.

 

 

13. int = DispatchMessage(msg)

 

메시지를 윈도우 처리 함수로 보내는 함수입니다.

 

인자로는 msg : MSG 가 있습니다.

 

리턴값은 윈도우 처리 함수의 리턴값인데 보통 사용하지 않는다고 합니다.

 

 

14. PumpMessages()

 

이 함수는 pywin32에서 만든 함수로 보입니다. GetMessage, TranslateMessage, DisplatchMessage 의 역할을 하며, 3가지 함수대신 이 함수를 이용해 윈도우 메시지를 처리할 수 있습니다.

 

WM_QUIT메시지가 나올 때까지 메시지를 처리합니다.

 

 

15. PostQuitMessage(rc)

 

시스템에게 현재 쓰레드를 종료시킬 거라고 알려주는 함수입니다. 보통 WM_DESTROY 메시지를 처리할 때 사용합니다.

 

인자로는 rc : int 가 있습니다.

 

rc: 종료 코드를 나타냅니다. WM_QUIT 메시지를 처리할 때 wParam에 넣어져서 사용된다고 합니다.

 

16. DestroyWindow(hwnd)

 

윈도우를 파괴하는 함수입니다. 이 함수가 호출되면 WM_DESTROY, WM_NCDESTROY 메시지를 보냅니다.

 

윈도우 프로시저는 이 함수를 통해 WM_DESTROY 메시지를 받고, WM_DESTROY 처리 함수에서 윈도우 종료를 처리합니다.

 

인자로는 hwnd : int 가 있습니다.

 

hwnd: 윈도우의 핸들 값

 

 

17. int = DefWindowProc(hwnd, message , wparam , lparam )

 

디폴트 윈도우 메시지 처리 함수를 호출합니다. 개발자가 작성한 윈도우 메시지 처리 함수에서 사용하지 않는 메시지에 대해 디폴트 처리를 수행합니다.

 

인자로는 hwnd : int, message : int, wparam : int, lparam : int

 

hwnd: 윈도우의 핸들값입니다.

 

message: 보낼 메시지 입니다.

 

wparam: 메시지와 함께 보낼 데이터입니다.

 

lparam: 메시지와 함께 보낼 데이터입니다. (2)

 

보통 윈도우 메시지 처리 함수에 인자로 들어오는 값을 그대로 사용합니다.

 

 

import win32gui
import win32api
import win32con
 
# WM_CREATE가 안생겨서 만든 WM_CREATE 대용 메시지
UM_CREATE=win32con.WM_USER + 1

PAINT_CNT=0
 
def WndProc(hwnd, iMsg, wParam, lParam):
    global PAINT_CNT
     
    if iMsg == UM_CREATE:
        print("create!")
        return 0
    elif iMsg == win32con.WM_DESTROY:
        print("destroy!")
        win32gui.PostQuitMessage(0)
        return 0
 
    elif iMsg == win32con.WM_PAINT:
        if PAINT_CNT == 0:
            print("paint")
            PAINT_CNT=1
        return 0
    elif iMsg == win32con.WM_CLOSE:
        win32gui.DestroyWindow(hwnd)
 
    return win32gui.DefWindowProc(hwnd, iMsg, wParam, lParam)
     
 
def WinMain():
    hInstance = win32api.GetModuleHandle()
 
 
    className = 'SimpleWin32'
 
    wndClass                = win32gui.WNDCLASS()
    wndClass.style          = win32con.CS_HREDRAW | win32con.CS_VREDRAW
    wndClass.lpfnWndProc    = WndProc
    wndClass.hInstance      = hInstance
    wndClass.hIcon          = win32gui.LoadIcon(0, win32con.IDI_APPLICATION)
    wndClass.hCursor        = win32gui.LoadCursor(0, win32con.IDC_ARROW)
    wndClass.hbrBackground  = win32gui.GetStockObject(win32con.WHITE_BRUSH)
    wndClass.lpszClassName  = className
 
 
    wndClassAtom = None
    wndClassAtom = win32gui.RegisterClass(wndClass)
 
    hwnd = win32gui.CreateWindow(
        wndClassAtom,
        "title test",
        win32con.WS_OVERLAPPEDWINDOW,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        0,
        0,
        hInstance,
        None)
     
    win32gui.SendMessage(hwnd, UM_CREATE, 0, 0)
    
    win32gui.AnimateWindow(hwnd, 500, win32con.AW_CENTER)
    #win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
    win32gui.UpdateWindow(hwnd)

    win32gui.PumpMessages()
    return 0
     
    '''
    msg = win32gui.GetMessage(hwnd, 0, 0)
    msg = msg[1]
 
 
    while msg[1]:
        win32gui.TranslateMessage(msg)
        win32gui.DispatchMessage(msg)
        msg = win32gui.GetMessage(hwnd, 0, 0)
        msg = msg[1]
     
    return msg[2]
    '''
 
 
if __name__ == "__main__":
    x = WinMain()

위의 예제 실행 시 윈도우 창이 하나 뜨고 다음의 내용을 Python Shell 에서 확인할 수 있습니다.

 

 

 

 

반응형

댓글()