Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Win32 SDK-Grundlagen (8) Detaillierte Erläuterung des Windows-Nachrichtenmechanismus (Bild)

Win32 SDK-Grundlagen (8) Detaillierte Erläuterung des Windows-Nachrichtenmechanismus (Bild)

黄舟
黄舟Original
2017-06-06 10:02:153918Durchsuche

1. Was ist eine Nachricht?

Bevor wir erklären, was eine Nachricht ist, besprechen wir zunächst den Ausführungsmechanismus des Programms. Generell können Programme nach ihren Ausführungsmechanismen in zwei Kategorien eingeteilt werden:
Die erste Kategorie ist der Prozess Treiber . Zum Beispiel das C-Programm, das wir geschrieben haben, als wir zum ersten Mal mit der Programmierung in Kontakt kamen, oder das Mikrocontroller-Programm. Diese Art von Programm hat oft einen voreingestellten Ausführungsprozess, und wenn wir ihn ausführen, führen wir ihn einfach Schritt für Schritt aus. Der zweite Typ ist
ereignisgesteuert . Ich glaube, jeder kann diesen Vorfall verstehen. Das Eintreten jedes Ereignisses ist zufällig und jedes Ereignis hat seinen eigenen Moment, ähnlich wie Ereignisse im Leben. Ereignisse im Programm haben auch ihre eigenen Triggerpunkte. Das ereignisgesteuerte Programm hat den Verarbeitungsablauf für jedes Ereignis im Voraus geschrieben. Im Windows-Betriebssystem sind Meldungen Ereignisse in Windows. Fast jeder Vorgang in Windows löst eine Meldung aus. Wie bereits erwähnt, löst das Erstellen eines Fensters eine WM_CREATE-Meldung aus, und das Zeichnen eines Fensters löst eine WM_PAINT-Meldung aus. Windows-Nachrichten werden in einer
Struktur namens MSG gekapselt, deren Prototyp wie folgt lautet:

typedef struct tagMSG { // msg 
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
Hwnd – das Handle des Fensters, das die Nachricht ausgelöst hat.

Nachricht – Nachrichten-ID. Das Windows-Betriebssystem weist jeder Nachricht eine Nachrichten-ID zu, und diese ID ist eindeutig. Die Essenz von WM_CREATE, die wir oben erwähnt haben, ist eine
Ganzzahl, die die Nachrichten-ID ist. wParam – Parameter, die an die Nachricht angehängt werden können.
lParam – Parameter, die an die Nachricht angehängt werden können.
Zeit – die Zeit, zu der die Nachricht aufgetreten ist.
Pt – Die Position der Maus, als die Nachricht auftrat.
Die oben genannten Parameter sind für die Nachricht unverzichtbar.
In Windows werden Nachrichten in MSG
Objekte gekapselt. Wenn eine Nachricht sendet, werden diese Objekte beim Empfang einer Nachricht in die Nachrichten-Warteschlange gestellt. Diese MSG-Objekte werden ebenfalls abgerufen.
2. Nachrichtenerfassung

2.1 Nachrichtenwarteschlange

Wir haben gesagt, dass fast jeder Vorgang in Windows eine Nachricht auslöst und diese Nachrichten an gesendet werden die Nachrichtenwarteschlange. Was ist eine Nachrichtenwarteschlange? Wir können es so verstehen, dass wir eine First-In-First-Out-Deque verwenden, um Msg-Objekte zu speichern – Dequeaee932e3af002b763748cf2e999e819c. Es gibt zwei Arten von Nachrichtenwarteschlangen: eine ist die Systemnachrichtenwarteschlange und die andere ist die Prozessnachrichtenwarteschlange. Nachdem wir die Nachricht ausgelöst haben, gelangt die Nachricht zunächst in die Systemnachrichtenwarteschlange. Nach der Verarbeitung ordnet das Betriebssystem die Nachricht basierend auf dem Hwnd-Wert des Fensterhandles der Nachricht der eigenen Nachrichtenwarteschlange unseres Programms zu und verarbeitet die Nachricht dann in unserem Programm.


2.2 Nachricht

Schleife

Im vorherigen Artikel haben wir einmal eine Nachrichtenschleife geschrieben. Die sogenannte Nachrichtenschleife besteht darin, die Nachrichten in der Nachrichtenwarteschlange in unserem Prozess kontinuierlich zu lesen und sie dann zu verarbeiten.


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


Hier, GetMessage( ) Erfasst kontinuierlich Nachrichten in der Nachrichtenwarteschlange. Der Prototyp seiner

-Funktion

lautet wie folgt: GetMessage (LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) lpMsg – wird zum Speichern von Nachrichten verwendet vom Typ MSG.
hWnd – gibt das Handle des Fensters an, aus dem die Nachricht abgerufen wird. Wenn der Wert NULL ist, ruft GetMessage Nachrichten für jedes Fenster ab, das zum aufrufenden Thread gehört.
wMsgFilterMin – Eine Ganzzahl, die den minimalen abzurufenden Nachrichtenwert angibt.
wMsgFilterMax – Eine Ganzzahl, die den maximalen abzurufenden Nachrichtenwert angibt.

Nachdem GetMessage() die Nachricht erhalten hat, übersetzt TranslateMessage die Nachricht und wandelt dabei hauptsächlich die virtuelle Schlüsselnachricht in eine Zeichennachricht um. Die Zeichennachricht wird an die Nachrichtenwarteschlange des aufrufenden Threads gesendet und ausgelesen, wenn der Thread das nächste Mal die Funktion GetMessage oder PeekMessage aufruft. Jede Tastaturtaste in Windows entspricht einem Makro, und die von dieser Tastaturtaste gesendete Nachricht ist eine virtuelle Tastennachricht. Die Funktion von TranslateMessage besteht darin, virtuelle Schlüsselnachrichten in Zeichennachrichten WM_CHAR, WM_SYSCHAR usw. umzuwandeln.


3. Nachrichtenverarbeitung

Die Funktion von DispatchMessage besteht darin, die Nachricht zur Verarbeitung an die durch unsere Implementierung definierte Fensterverarbeitungsfunktion zu senden Fensterverarbeitungsfunktion:

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

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


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


Das obige ist der detaillierte Inhalt vonWin32 SDK-Grundlagen (8) Detaillierte Erläuterung des Windows-Nachrichtenmechanismus (Bild). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn