SendMessage API에 대해 알아보기 전에, SendMessage의 함수 원형을 먼저 살펴보도록 합시다.
LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
원형을 살펴보자면, 첫번째 인수로는 메시지를 전달받을 윈도우 핸들을, 두번째 인수로는 전달할 메시지를, 세번째 인수로는 메시지의 부가 정보라고 말할 수 있겠습니다. 전달하는 메시지에 따라 의미가 달라집니다. 네번째 인수 역시도 메시지의 부가 정보이며, 세번째와 네번째에 있는 wParam, IParam의 기본값은 0입니다. 반환값으로는 전달되는 메시지에 따른 처리 결과가 반환됩니다.
이 SendMessage API 함수는 윈도우 프로시저로 메시지를 보내 즉각 처리합니다. 이렇게 메시지를 보내주면 이 메시지가 처리되기 전까지는 반환이 되지 않습니다. 즉, 윈도우 프로시저가 값을 반환해야만 SendMessage도 반환하여 끝마칠 수 있는데, 만약에 전달한 메시지가 처리되지 않은 상태로 남아있을때 다음 루틴을 실행하지 못하고 윈도우 프로시저는 실행을 멈추게 됩니다. 이러한 상태를 메시지 데드락 상태에 진입했다고 말합니다.
전달될 수 있는 메세지는 무척이나 다양합니다. 리스트박스, 버튼, 다이얼로그, 콤보박스, 스크롤바 등등. 다른 메시지도 확인해보고 싶으시면, WinUser.h를 여시면 모두 정의되어 있으니 참고하시는 것도 좋을듯 합니다. 아래는 버튼(BM, Button Message)에 관한 메시지를 표로 정리해둔 것입니다.
코드 | 설명 |
---|---|
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를 이용하여 프로그램의 버튼을 클릭해보도록 하겠습니다.
이 프로그램은 버튼을 클릭하면 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 함수가 반환값을 내보내고 비로소 종료가 되는것 입니다.