rokhakr
winapi - Message 본문
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