API 탐방 3편. 특정 윈도우의 핸들에 메시지를 전달하는 SendMessage
[API 탐방기]
특정 윈도우의 핸들에 메시지를 전달하는
SendMessage
SendMessage API에 대해 알아보기 전에, SendMessage의 함수 원형을 먼저 살펴보도록 합시다.
LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
원형을 살펴보자면, 첫번째 인수로는 메시지를 전달받을 윈도우 핸들을, 두번째 인수로는 전달할 메시지를, 세번째 인수로는 메시지의 부가 정보라고 말할 수 있겠습니다. 전달하는 메시지에 따라 의미가 달라집니다. 네번째 인수 역시도 메시지의 부가 정보이며, 세번째와 네번째에 있는 wParam, IParam의 기본값은 0입니다. 반환값으로는 전달되는 메시지에 따른 처리 결과가 반환됩니다.
이 SendMessage API 함수는 윈도우 프로시저로 메시지를 보내 즉각 처리합니다. 이렇게 메시지를 보내주면 이 메시지가 처리되기 전까지는 반환이 되지 않습니다. 즉, 윈도우 프로시저가 값을 반환해야만 SendMessage도 반환하여 끝마칠 수 있는데, 만약에 전달한 메시지가 처리되지 않은 상태로 남아있을때 다음 루틴을 실행하지 못하고 윈도우 프로시저는 실행을 멈추게 됩니다. 이러한 상태를 메시지 데드락 상태에 진입했다고 말합니다.
전달될 수 있는 메세지는 무척이나 다양합니다. 리스트박스, 버튼, 다이얼로그, 콤보박스, 스크롤바 등등. 다른 메시지도 확인해보고 싶으시면, WinUser.h를 여시면 모두 정의되어 있으니 참고하시는 것도 좋을듯 합니다. 아래는 버튼(BM, Button Message)에 관한 메시지를 표로 정리해둔 것입니다.
메시지 |
UINT |
설명 |
BM_GETCHECK |
0x00F0 |
체크 박스의 상태를 얻어옴 |
BM_SETCHECK |
0x00F1 | 체크 박스의 체크 상태를 변경함 |
BM_GETSTATE |
0x00F2 |
버튼의 체크상태나 포커스 상태, 푸쉬 상태를 얻어옴 |
BM_SETSTATE |
0x00F3 |
버튼의 체크상태나 포커스 상태, 푸쉬 상태를 설정함 |
BM_SETSTYLE |
0x00F4 |
버튼의 스타일을 설정함 |
BM_CLICK |
0x00F5 |
버튼을 클릭함 |
BM_GETIMAGE |
0x00F6 |
버튼의 비트맵 또는 아이콘의 핸들을 얻어옴 |
BM_SETIMAGE |
0x00F7 |
버튼의 비트맵 또는 아이콘의 핸들을 설정함 |
이번에는, SendMessage API를 이용하여 Visual Basic6으로 개발된 프로그램의 버튼을 클릭해보도록 하겠습니다.
이 프로그램은 버튼을 클릭하면 CLICKED! 라는 내용을 담은 메시지박스가 화면에 표시됩니다.
#include <stdio.h> #include <windows.h> int main(void) { HWND hWnd = FindWindow(NULL, TEXT("폼")); HWND hWndButton = FindWindowEx(hWnd, NULL, NULL, TEXT("버튼 클릭")); if (hWnd) SendMessage(hWndButton, BM_CLICK, 0, 0); else printf("폼을 실행하지 않았습니다.\n"); return 0; }
결과:
이렇게 버튼 클릭 메시지를 전달하면, 프로그램에서 클릭한 것과 같이 CLICKED! 라는 내용을 담은 메세지박스가 화면에 표시됩니다. 위에서 말했듯이, 저 메시지박스가 처리되지 않는 이상 SendMessage 함수는 종료되지 않습니다. 저 메세지박스를 확인한 후에야, SendMessage 함수가 반환값을 내보내고 비로소 종료가 되는것 입니다.
'프로그래밍 관련 > API' 카테고리의 다른 글
API 탐방 6편. 자신의 위치를 얻어오는 GetCurrentDirectory, GetModuleFileName (1) | 2012.11.18 |
---|---|
API 탐방 5편. 윈도우를 생성하고 표시하자! CreateWindow, ShowWindow (0) | 2012.11.11 |
API 탐방 4편. 윈도우의 캡션을 설정하거나 가져오는 SetWindowText, GetWindowText (1) | 2012.10.21 |
API 탐방 2편. 키의 상태를 확인하는 GetKeyState, GetAsyncKeyState (4) | 2012.10.20 |
API 탐방 1편. 최상위의 핸들을 찾는 FindWindow (2) | 2012.10.20 |