메시지가 무엇인지 설명하기 전에 먼저 프로그램의 실행 메커니즘을 살펴보겠습니다. 일반적으로 프로그램은 실행 메커니즘에 따라 두 가지 범주로 나눌 수 있습니다.
첫 번째 범주는 프로세스드라이버입니다. 예를 들어, 프로그래밍을 처음 접했을 때 작성한 C 프로그램이나 마이크로 컨트롤러 프로그램이 있습니다. 이러한 유형의 프로그램에는 미리 설정된 실행 프로세스가 있는 경우가 많으며, 이를 실행할 때 단계별로 실행합니다. 두 번째 유형은
이벤트 중심입니다. 이번 사건은 모두가 이해할 수 있을 것이라 믿습니다. 각 사건의 발생은 무작위이며 각 사건은 인생의 사건과 유사하게 고유한 순간을 갖습니다. 프로그램의 이벤트에는 자체 트리거 지점도 있습니다. 이벤트 중심 프로그램은 각 이벤트에 대한 처리 흐름을 미리 작성했습니다. Windows 운영 체제에서 메시지는 Windows의 이벤트입니다. Windows의 거의 모든 작업은 메시지를 트리거합니다. 앞서 말했듯이 창을 만들면 WM_CREATE 메시지가 트리거되고, 창을 그리면 마우스나 키보드를 클릭하면 해당 메시지가 트리거됩니다. Windows 메시지는 MSG라는
구조 로 캡슐화됩니다. 이 구조의 프로토타입은 다음과 같습니다.
typedef struct tagMSG { // msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
메시지 - 메시지 ID입니다. Windows 운영 체제는 각 메시지에 메시지 ID를 할당하며 이 ID는 고유합니다. 위에서 언급한 WM_CREATE는 기본적으로 메시지 ID인
정수입니다. wParam - 메시지에 첨부할 수 있는 매개변수입니다.
lParam - 메시지에 첨부할 수 있는 매개변수입니다.
시간 - 메시지가 발생한 순간입니다.
Pt - 메시지가 발생했을 때 마우스의 위치입니다.
위 매개변수는 메시지에 반드시 필요합니다.
Windows에서는 각 메시지가 MSG
개체로 캡슐화됩니다. 메시지 보내기에서 이러한 개체는 메시지를 받을 때 메시지 queue에 배치되며 이러한 MSG 개체도 획득됩니다.
void Message() { MSG nMsg = { 0 }; while (GetMessage(&nMsg, NULL, 0, 0)) { TranslateMessage(&nMsg); DispatchMessage(&nMsg); } }
function 프로토타입은 다음과 같습니다. GetMessage(LPMSG lpMsg, HWND hWnd, UINT w MsgF 필터민, UINT wMsgFilterMax)
lpMsg - 메시지를 저장하는 데 사용되는 MSG 유형의 포인터입니다.
hWnd - 메시지를 가져온 창의 핸들을 지정합니다. 해당 값이 NULL이면 GetMessage는 호출 스레드에 속한 모든 창에 대한 메시지를 검색합니다.
wMsgFilterMin – 검색할 최소 메시지 값을 지정하는 정수입니다.
wMsgFilterMax – 검색할 최대 메시지 값을 지정하는 정수입니다.
GetMessage()가 메시지를 얻은 후 TranslateMessage는 주로 가상 키 메시지를 문자 메시지로 변환하여 메시지를 번역합니다. 문자 메시지는 호출 스레드의 메시지 큐로 전송되고 다음에 스레드가 GetMessage 또는 PeekMessage 함수를 호출할 때 읽혀집니다. Windows의 각 키보드 키는 매크로에 해당하며 이 키보드 키가 보내는 메시지는 가상 키 메시지입니다. TranslateMessage의 기능은 가상 키 메시지를 문자 메시지 WM_CHAR, WM_SYSCHAR 등으로 변환하는 것입니다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0);//可¨¦以°?使º1GetMessage返¤¦Ì回?0 break; default: break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); }
hWnd就是产生消息的窗口句柄,uMsg是传递的消息,wParam和lParam分别是消息携带的两个参数。在上面的窗口处理函数中,我们定只处理了一个消息WM_DESTROY,这是我们在点击窗口的关闭按钮后产生的一个消息。我们说过,我们在创建窗口是,也会产生一个WM_CREATE消息。下面我们在窗口处理函数中处理这个消息:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0);//可¨¦以°?使º1GetMessage返¤¦Ì回?0 break; case WM_CREATE: MessageBox(NULL,"WM_CREATE消息被处理了","消息处理",MB_OK); default: break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); }
我们在接受到WM_CREATE后,会弹出一个对话框。预期的效果是点击这个对话框的确定按钮后才会显示窗口。如下面所示:
运行程序,先弹出对话框:
点击确定按钮后,弹出窗口:
위 내용은 Win32 SDK 기초(8) Windows 메시지 메커니즘에 대한 자세한 설명(그림)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!