Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

rokhakr

winapi - Message 본문

카테고리 없음

winapi - Message

rokhakr 2020. 10. 10. 17:43

Windows API Programming - Message

Windows 내부에서 작동하는 하나의 프로그램은 보안상의 이유로 시스템 드라이버와 직접 대화하지 못한다.
그렇다면 경유해서 클릭되었다는 것을 알 수 있도록 제공해야하는 데 방법은 다음과 같다.
Mouse(Clicked) -> Driver -> Windows -> Message Queue -> Application
1. 마우스 클릭을 한다 -> 이 동작으로 인해 마우스가 특정한 포트로 컴퓨터에 신호를 보낸다. 하지만, 신호는 마우스 제작자가 정한 특정한 기호임
2. 고로, 드라이버가 신호를 해석한다 -> Driver는 그 신호를 해석하기 위해 존재하는 하나의 층(Layer)이다. 
3. Driver에서 해석된 신호를 Windows로 보낸다.
4. Windows에서 받은 신호를 전역 Message Queue로 보낸다 -> 신호를 받은 Windows는 이 전역 메시지 큐로 신호 메시지(WM_LBUTTONDOWN)을 보낸다.
5. Message Queue에서 메시지를 받아야 할 적당한 프로그램에게 메시지를 전달한다 -> 마우스 클릭 된 위치에 존재하는 프로그램이 마우스 클릭 메시지를 받는다.
위 과정을 외울 필욘 없다. 이 모든 과정은 Windows와 Driver가 알아서 처리 해주기 때문이다. 우리는 받은 메시지들을 이용하기만 하면 된다!

 

#include <Windows.h>
#include <tchar.h>		// 멀티바이트, 유니코드 모두를 지원하는 각종 문자열 형식 함수를 사용할 수 있게 해줌


// Window Procedure, 줄여서 프로시저라고 부른다. 이 프로시저를 이용하면 창의 각종 메시지를 처리할 수 있다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
	switch (iMsg) {
	case WM_LBUTTONDOWN:
		MessageBox(hWnd, TEXT("마우스 왼쪽 버튼을 눌렀습니다!"), TEXT("WM_LBUTTONDOWN"), MB_OK);
		break;
	case WM_DESTROY:	// WM_DESTROY - Window(창)이 닫힐 때 전달되는 메시지
		MessageBox(hWnd, TEXT("X 버튼을 눌렀습니다!"), TEXT("WM_DESTROY"), MB_OK);
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hWnd, iMsg, wParam, lParam);	// 처리되지 않은 메시지 반환
}

INT APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, TCHAR *pszLine, INT nShow) {
	WNDCLASS wc;
	HWND hWnd;
	MSG msg;

	wc.style = CS_OWNDC;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon(NULL, IDC_ICON);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = reinterpret_cast<HBRUSH>(GetStockObject(BLACK_BRUSH));
	//wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 0));
	wc.lpszMenuName = NULL;
	wc.lpszClassName = TEXT("MyApp");

	RegisterClass(&wc);

	hWnd = CreateWindow(TEXT("MyApp"), TEXT("Sample Application"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

	ShowWindow(hWnd, SW_SHOW);

	while (GetMessage(&msg, NULL, NULL, NULL)) {
		TranslateMessage(&msg);	// 키보드 해석
		DispatchMessage(&msg);	// 메시지 전달
	}
	return 0;
}
Comments