Media Log

[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 함수가 반환값을 내보내고 비로소 종료가 되는것 입니다.

  1. 푸르름 at 2018.10.02 12:30 신고 [edit/del]

    SendMessage 함수가 여러 종류 있는 것 같은데요.
    예를 들어
    SendMessage(hWnd, ..);
    ::SendMessage(hWnd, ..);
    hWnd->SendMessage(, ..);
    각각에 대해서 어는 경우에 구별하여 사용해야 하는지 설명을 해 주시면 감사하겠습니다.

    Reply

submit

티스토리 툴바