3. [pywin32] Windows 관련 함수 - 2
어제 진행했던 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 에서 확인할 수 있습니다.
'pywin32 > win32gui' 카테고리의 다른 글
6. [pywin32] LineAndCurve 관련 함수 - 2 (0) | 2021.12.17 |
---|---|
5. [pywin32] LineAndCurve 관련 함수 - 1 (0) | 2021.12.10 |
4. [pywin32] FontAndText 관련 함수 (0) | 2021.12.06 |
2. [pywin32] Windows 관련 함수 - 1 (0) | 2021.01.12 |
1. [pywin32] win32gui 소개 (0) | 2020.08.22 |