자료 저장소

#메시지 범위

WM_CREATE 1
WM_DESTROY2
WM_MOVE 3
WM SIZE 4
WM_ACTIVATE5
WM_PAINT 0xf
WM_KEYDOWN 0x100
WM_KEYUP0x101
WM_COMMAND0x111
WM_MOUSEMOVE0x200
WM_LBUTTONDOWN 0x201


메시지 실제 값은 위 표와 같다.
프로그래밍을 할때는 보통 WM_ 등의 매크로 상수만을 사용하므로 메시지 ID의 실제 상수값은 굳이 몰라도
상관없지만 저수준의 디버깅때에는 매크로 상수를 볼 수 없으므로 이 값을 알아야 하는 경우도 가끔 있다.

메시지의 ID의 데이터 형은 부호없는 정수형 UINT형이고 범위는 2의 32승이다. 구분 가능한 메시지의 갯수는
대략 40억개에 이른다. 하지만 실제로 사용되는 메시지의 수는 불과 천 개도 안되며 나머지 ID는 대부분
특수한 용도로 예약되어 있다.

0 ~ WM_USER-1 :
시스템 메시지용으로 예약 되어 있으며 WM_로 시작되는 대부분의 메시지는 이 영역에 예약되어 있다.

WM_USER ~ WM_APP-1 :
응용 프로그램이 자신의 필요에 따라 사용할 수 있는 메시지 영역이다. 내부적인 용도로만 사용해야 하며 응용
프로그램간의 통신을 위해 이 영역의 메시지를 사용해서는 안된다.

WM_APP ~ 0xBFFF :
응용 프로그램이 개별적인 용도로 사용할 수 있는 영역이며 시스템은 이 영역의 메시지를 전혀 사용하지 않는다.

0xC000 ~ 0xFFFF :
이 영역의 메시지는 실행중에 메시지를 등록하는 별도의 함수에 의해 정의된다. 복수 개의 응용 프로그램이 같은
이름으로 메시지를 등록할 수 있으므로 응용 프로그램간의 통신에 사용될 수 있다.

0xFFFF ~ :
장래의 사용을 위해 예약된 영역이다.


# 사용자 정의 메시지

응용 프로그램은 시스템이 정의한 메시지 외에 자신이 필요에 따라 고유의 메시지를 반들어 사용할 수 도 있다.
메시지는 어차피 약속이기 때문에 메시지의 의미는 응용 프로그램이 정하기 나름이다.

[메시지 정의의 예]
#define WM_SORI WM_USER+1

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
...
switch(iMessage)
{
case WM_SORI :
...
}

}
WM_USER는 0x400이므로 0x401의 값을 가진 WM_SORI라는 메시지를 정의해서 사용 할 수 있다.
간단한 예제에서는 메시지를 정의해서 특별한 의미 없이 함수처럼 사용 되버릴 수도 있다.
위와 같은 case문은 하나의 독립적인 처리를 하므로 함수 하나와 자격이 거의 같다고 할 수 있으며 case문을
호출 하는 것은 함수를 호출 하는것과 같다. 하지만 함수는 같은 응용 프로그램 내에서만 호출 가능하지만
메시지는 훨씬  더 호출 범위가 넓어서 프로세스의 경계를 넘어설 수도 있다는 점이 다르다.


# 문자열로 메시지 등록하기

불특정 다수와 통신해야 하는 프로그램은 문자열로 ID를 등록해서 사용해야 한다.

UINT RegisterWindowMessage(LPCTSTR lpString);

이 함수는 문자열로 받고 싶은 메시지의 이름을 전달하면 어떤 프로그램도 사용하지 않는 빈 ID를 하나 찾아
리턴한다. 만약 이미 등록된 이름이면 ID를 다시 리턴한다. 두 프로그램이 같은 이름으로 ID를 등록할 경우
같은 메시지 ID를 받게 되며 이를 이용해서 통신이 가능해진다. 등록된 ID이므로 이름이 중복되지 않는 한
절대로 이 ID를 다른 프로그램이 사용할 경우란 없으며 그래서 좀 더 안전하다.

등록 하는 이름이 중복되면 이때는 어쩔 수 없이 부작용이 발생할 것이다. 그래서 메시지의 이름을 줄 때
짧은 이름을 주지 말고 가급적 길게 작성하여 최대한 중복을 방지 하는 것이 좋다. 문자열의 메시지의 ID는
실행중에 조사되는 변수이므로 WndProc에서 이 메시지를 처리 할 때는 if문으로 수신 여부를 점검해야 한다.


댓글 로드 중…

최근에 게시된 글