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

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(Deque)를 사용하는 것으로 이해할 수 있습니다. 메시지 대기열에는 두 가지 유형이 있습니다. 하나는 시스템 메시지 대기열이고 다른 하나는 프로세스 메시지 대기열입니다. 메시지를 트리거한 후 메시지는 먼저 시스템 메시지 대기열에 들어갑니다. 처리 후 운영 체제는 메시지의 창 핸들 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으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경