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;
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.2 Nachricht
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
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!