Maison  >  Article  >  Opération et maintenance  >  Bases du SDK Win32 (8) Explication détaillée du mécanisme de message Windows (image)

Bases du SDK Win32 (8) Explication détaillée du mécanisme de message Windows (image)

黄舟
黄舟original
2017-06-06 10:02:153918parcourir

1. Qu'est-ce qu'un message

Avant d'expliquer ce qu'est un message, discutons d'abord du mécanisme d'exécution du programme. De manière générale, les programmes peuvent être divisés en deux catégories selon leurs mécanismes d'exécution :
La première catégorie est le processus pilote . Par exemple, le programme C que nous avons écrit lors de notre premier contact avec la programmation, ou le programme du microcontrôleur. Ce type de programme a souvent un processus d'exécution prédéfini, et lorsque nous l'exécutons, nous l'exécutons simplement étape par étape
Le deuxième type est événementiel  ; Je pense que tout le monde peut comprendre cet incident. La survenance de chaque événement est aléatoire, et chaque événement aura son propre moment, semblable aux événements de la vie. Les événements du programme auront également leurs propres points de déclenchement. Le programme événementiel a écrit à l'avance le flux de traitement pour chaque événement. Dans le système d'exploitation Windows, les messages sont des événements dans Windows. Presque toutes les opérations sous Windows déclencheront un message. Comme nous l'avons dit précédemment, la création d'une fenêtre déclenchera un message WM_CREATE, et le dessin d'une fenêtre déclenchera un message WM_PAINT. Lorsque nous cliquons sur la souris ou le clavier, le message correspondant sera déclenché.
Les messages Windows sont encapsulés dans une structure appelée MSG, dont le prototype est le suivant :

typedef struct tagMSG { // msg 
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;

Hwnd - le handle de la fenêtre qui a déclenché le message.
Message - ID du message. Le système d'exploitation Windows attribue un ID de message à chaque message, et cet ID est unique. L'essence de WM_CREATE que nous avons mentionné ci-dessus est un entier, qui est l'ID du message.
wParam - Paramètres pouvant être attachés au message.
lParam - Paramètres pouvant être attachés au message.
Heure - l'heure à laquelle le message est apparu.
Pt - La position de la souris lorsque le message est apparu.
Les paramètres ci-dessus sont indispensables pour le message.
Sous Windows, les messages sont encapsulés dans des objets MSG. Lorsque envoie un message, ces objets sont placés dans la file d'attente ; Ces objets MSG sont également obtenus.

2. Acquisition de messages

2.1 File d'attente des messages

Nous avons dit que presque toutes les opérations sous Windows déclencheront un message, et ces messages seront envoyés dans la file d'attente des messages. Qu'est-ce qu'une file d'attente de messages ? Nous pouvons le comprendre comme l'utilisation d'un Deque premier entré, premier sorti pour stocker les objets Msg - Dequeaee932e3af002b763748cf2e999e819c. Il existe deux types de files d'attente de messages : l'une est la file d'attente de messages système et l'autre est la file d'attente de messages de processus. Après avoir déclenché le message, celui-ci entre d'abord dans la file d'attente des messages système. Après le traitement, le système d'exploitation allouera le message à la propre file d'attente de messages de notre programme en fonction de la valeur hwnd du gestionnaire de fenêtre du message, puis traitera le message dans notre programme.


2.2 Message

Boucle

Dans l'article précédent, nous avons écrit une fois une boucle de message. La boucle de messages consiste à lire en continu les messages dans la file d'attente des messages dans notre processus, puis à les traiter.


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


Ici, GetMessage( ) récupère en permanence les messages dans la file d'attente des messages. Le prototype de sa

fonction est le suivant : GetMessage (LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
lpMsg - utilisé pour stocker les messages Pointeur. de type MSG.
hWnd - spécifie le handle de la fenêtre à partir de laquelle le message est obtenu. Lorsque sa valeur est NULL, GetMessage récupère les messages de toute fenêtre appartenant au thread appelant.
wMsgFilterMin - Un entier spécifiant la valeur minimale du message à récupérer.
wMsgFilterMax - Un entier spécifiant la valeur maximale du message à récupérer.

Une fois que GetMessage() a obtenu le message, TranslateMessage traduira le message, convertissant principalement le message de clé virtuelle en un message de caractères. Le message de caractères est envoyé à la file d'attente des messages du thread appelant et est lu la prochaine fois que le thread appelle la fonction GetMessage ou PeekMessage. Chaque touche du clavier sous Windows correspond à une macro, et le message envoyé par cette touche du clavier est un message de touche virtuelle. La fonction de TranslateMessage est de convertir les messages de clé virtuelle en messages de caractères WM_CHAR, WM_SYSCHAR, etc.

3. Traitement des messages

La fonction de DispatchMessage est d'envoyer le message à la fonction de traitement de fenêtre définie par notre implémentation pour le traitement. Fonction de traitement de fenêtre :


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后,会弹出一个对话框。预期的效果是点击这个对话框的确定按钮后才会显示窗口。如下面所示:

        运行程序,先弹出对话框:


        点击确定按钮后,弹出窗口:


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn