6.메시지 뷰

메시지 뷰는 윈도우로 전달되는 모든 메시지를 감시하여 어떤 메시지가 어떤 인수와 함께 전달되었는지를 보여준다. 프로세스나 스레드로 전달되는 메시지를 감시할 수도 있지만 주로 윈도우의 메시지를 감시하는 경우가 많다. 전달되는 모든 메시지를 순서대로 살펴볼 수 있기 때문에 디버깅과 분석시에 아주 큰 도움이 된다.

메시지 뷰를 열 때는 각 뷰의 팝업 메뉴에서 메시지 항목을 선택하면 된다. 예를 들어 메모장의 에디트 컨트롤로 전달되는 메시지를 보고 싶다면 창 뷰에서 에디트 컨트롤을 선택하고 팝업 메뉴에서 메시지 항목을 선택하면 된다. 또는 창 찾기 대화상자에서 찾기 도구를 메모장의 에디트에 떨어뜨린 후 대화상자 아래의 표시 항목을 메시지로 선택해도 된다.

 

메시지 기록이 시작되면 메시지 뷰가 열리며 여기에 해당 윈도우로 전달되는 메시지들이 순서대로 출력된다. 스파이는 메시지 감시를 위해 후킹을 사용하기 때문에 메시지를 감시하는동안에는 시스템의 전반적인 속도가 눈에 띄게 느려지는데 속도만 느려질 뿐 기능상의 문제는 없다. 윈도우로 전달되는 메시지를 일일이 감시하고 문자열로 바꾸어 출력하고 있으니 느려질 수밖에 없다. 다음은 메모장으로 전달되는 메시지들이다.

제일 왼쪽의 번호는 메시지의 일련 번호이며 두번째 칸의 16진수는 메시지를 받은 윈도우의 핸들이다. 세번째 P,R,S,s는 메시지가 전달된 방식을 나타내는 메시지 코드가 출력된다. 메시지 코드는 다음과 같다.

 

코드

설명

P

PostMessage 함수로 메시지 큐에 붙여진 메시지이다.

S

SendMessage 함수에 의해 윈도우 프로시저로 직접 전달된 메시지이다.

R

S 보내진 메시지를 처리한 결과이다. 메시지 처리 중에 다른 메시지를 보낼 있기 때문에 S R 중첩될 있다.

s

S 유사하되 보안상의 이유로 메시지의 처리 결과를 조사할 없다.

 

메시지 코드 다음에는 실제 전달된 메시지와 메시지의 인수들이 표시되는데 각 메시지별로 의미가 해석되어 있다. 예를 들어 WM_KEYDOWN이면 어떤 키가 눌러졌고 반복 회수는 얼마이며 스캔코드와 확장키의 상태 등이 표시되며 WM_CHAR이면 입력된 문자를 보여준다. wParam, lParam을 보여주는 것이 아니라 인수로 전달된 메시지의 논리적인 실제값을 보여주기 때문에 메시지의 의미를 파악하기가 쉽도록 되어 있다.

윈도우로 아주 많은 메시지가 전달될 뿐만 아니라 전달되는 속도가 대단히 빠르기 때문에 순식간에 수백개의 메시지가 전달된다. 그러다 보니 정작 관심있는 메시지가 너무 빨리 위로 스크롤되어 버리는 불편함이 있는데 스파이는 원하는 메시지를 자세히 살펴 볼 수 있도록 몇가지 장치를 제공한다.

우선 툴바의  버튼을 누르면 기록을 잠시 중지/재개할 수 있다. 살펴보고 싶은 메시지가 전달되었으면 메시지 기록을 일단 중지하고 목록을 살펴볼 수 있다.  버튼은 지금까지 작성한 모든 기록을 삭제하고 다시 기록을 시작하도록 한다.  버튼은 메시지 기록에 대한 몇가지 옵션을 지정하는 다음 대화상자를 보여 준다.

세 개의 페이지로 구성되어 있는데 이 대화상자에도 찾기 도구가 있으므로 대상 윈도우를 직접 변경할 수 있다. 뿐만 아니라 추가 창을 선택하면 관련있는 주변 윈도우로 전달되는 메시지도 같이 감시할 수 있다. 메시지 페이지에서는 기록 대상 메시지를 선택한다.

디폴트로 모든 메시지를 다 기록하도록 되어 있는데 여기서 관심있는 메시지만 선택하거나 불필요한 메시지는 선택 취소할 수 있다. 예를 들어 다른 메시지는 관심이 없고 키보드 관련 메시지만 보고 싶다면 Keyboard만 선택하면 된다. 또한 WM_MOUSEMOVE, WM_NCHITTEST 같은 메시지는 너무 자주 발생하므로 제외시킬 수도 있다. 출력 페이지는 메시지의 출력 형식을 지정한다.

파일에도 로그 옵션을 선택하고 파일명을 주면 메시지 기록을 텍스트 파일에도 작성해 주므로 조사가 끝난 후 파일을 열어서 볼 수 있다. 메시지 전달 속도가 너무 빠르기 때문에 화면으로 확인하기 힘든 메시지는 파일에서 정밀 검색하면 된다.

메시지 뷰가 보여 주는 정보는 아주 다양하게 활용된다. 우선 디버깅에 활용되는데 메시지가 전달되는 순서와 처리되는 과정을 자세하게 살펴 볼 수 있어 프로그램의 동작을 세밀하게 감시할 수 있다. 프로그램이 이상 동작을 한다면 그 시점이 언제인지를 스파이로 조사할 수 있으며 일단 시점이 파악되면 디버거로 해당 메시지를 집중 디버깅해 보면 된다. 또한 원치않은 메시지가 발생한다면 어떤 메시지에 의해 추가로 발생한 메시지인지, 그 순서는 어떻게 되는지를 알 수 있으며 SendMessage로 보낸 메시지를 확실히 수신했는지 확인할 수도 있다.

Win32 API를 처음 공부하는 사람에게 스파이는 또한 학습용으로도 아주 가치가 있는데 예를 들어 IME같이 메시지의 순서나 파생 관계가 복잡할 때 스파이를 활용하면 메시지의 발생 시기와 순서을 정확하게 알 수 있다.