본문 바로가기
개발/Windows

[Win32] 메시지 루프는 어떻게 창에 메시지를 전달할까?

by lucidmaj7 2022. 7. 31.
728x90
반응형

하나의 윈도우 프로그램에는 여러 개의 창이 존재한다. 그리고 그 창에는 자기한테 들어온 메시지를 처리하기 위해 각자의 프로시저(Procedure)를 갖는다(엄밀히 창 클래스마다 프로시저를 갖는다). 그렇다면 어떻게 메시지 루프는 메시지에 알맞은 창을 찾을 수 있을까?

다음은 일반적인 윈도우 프로그램의 메인 메시지 루프(싱글스레드)이다.

    // Main message loop:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

메시지 큐에서 GetMessage로 메시지를 가져와 TranslateMessage등으로 처리를 하고 최종적으로 DispachMessage 함수호출하여 윈도우 프로시저에 전달한다. 

여기서 어떻게 메지시를 알맞은 윈도우 프로시저에 전달 할 수 있을까?

당연하게도 MSG구조체에 윈도우 HANDLE 필드가 존재한다.

typedef struct tagMSG {
  HWND   hwnd;
  UINT   message;
  WPARAM wParam;
  LPARAM lParam;
  DWORD  time;
  POINT  pt;
  DWORD  lPrivate;
} MSG, *PMSG, *NPMSG, *LPMSG;

DispatchMessage함수는 MSG구조체에 hwnd필드를 보고 해당 메시지를 받을 윈도우를 알 수 있다.

(별 내용은 아님)

https://docs.microsoft.com/en-us/windows/win32/winmsg/about-messages-and-message-queues#message-loop

 

About Messages and Message Queues - Win32 apps

This section discusses Windows messages and message queues.

docs.microsoft.com

 

728x90
반응형

댓글