>  기사  >  운영 및 유지보수  >  Win32 SDK 기초(8) Windows 메시지 메커니즘에 대한 자세한 설명(그림)

Win32 SDK 기초(8) Windows 메시지 메커니즘에 대한 자세한 설명(그림)

黄舟
黄舟원래의
2017-06-06 10:02:154003검색

1. 메시지란 무엇인가요?

메시지가 무엇인지 설명하기 전에 먼저 프로그램의 실행 메커니즘을 살펴보겠습니다. 일반적으로 프로그램은 실행 메커니즘에 따라 두 가지 범주로 나눌 수 있습니다.
첫 번째 범주는 프로세스드라이버입니다. 예를 들어, 프로그래밍을 처음 접했을 때 작성한 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;

Hwnd - 메시지를 트리거한 창의 핸들입니다.

메시지 - 메시지 ID입니다. Windows 운영 체제는 각 메시지에 메시지 ID를 할당하며 이 ID는 고유합니다. 위에서 언급한 WM_CREATE는 기본적으로 메시지 ID인
정수입니다. wParam - 메시지에 첨부할 수 있는 매개변수입니다.
lParam - 메시지에 첨부할 수 있는 매개변수입니다.
시간 - 메시지가 발생한 순간입니다.
Pt - 메시지가 발생했을 때 마우스의 위치입니다.
위 매개변수는 메시지에 반드시 필요합니다.
Windows에서는 각 메시지가 MSG
개체로 캡슐화됩니다. 메시지 보내기에서 이러한 개체는 메시지를 받을 때 메시지 queue에 배치되며 이러한 MSG 개체도 획득됩니다.

2. 메시지 획득

2.1 메시지 큐

Windows의 거의 모든 작업은 메시지를 트리거하며 이러한 메시지는 메시지 큐로 전송된다고 말했습니다. 메시지 대기열이란 무엇입니까? 우리는 Msg 객체를 저장하기 위해 선입선출 Deque(Dequeaee932e3af002b763748cf2e999e819c)를 사용하는 것으로 이해할 수 있습니다. 메시지 대기열에는 두 가지 유형이 있습니다. 하나는 시스템 메시지 대기열이고 다른 하나는 프로세스 메시지 대기열입니다. 메시지를 트리거한 후 메시지는 먼저 시스템 메시지 대기열에 들어갑니다. 처리 후 운영 체제는 메시지의 창 핸들 hwnd 값을 기반으로 프로그램 자체의 메시지 대기열에 메시지를 할당한 다음 프로그램 내에서 메시지를 처리합니다.


2.2 메시지

루프

이전 기사에서 메시지 루프를 작성한 적이 있습니다. 소위 메시지 루프는 우리 프로세스의 메시지 큐에 있는 메시지를 지속적으로 읽고 처리하는 것입니다.


void Message()  
{  
    MSG nMsg = { 0 };  
    while (GetMessage(&nMsg, NULL, 0, 0))  
    {  
        TranslateMessage(&nMsg);  
        DispatchMessage(&nMsg);  
    }  
}


여기서 GetMessage()는 메시지 대기열에서 메시지를 지속적으로 가져옵니다.

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 등으로 변환하는 것입니다.

3. 메시지 처리

DispatchMessage의 기능은 처리를 위해 구현에서 정의한 창 처리 함수로 메시지를 전달하는 것입니다.


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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.