Heim > Artikel > Betrieb und Instandhaltung > Win32 SDK-Grundlagen (11) Detaillierte Erläuterung der Nachrichtenwarteschlange und GetMessage/PeekMessage, SendMessage/Postmesage
Nachrichten werden zuerst in der Warteschlange gespeichert Windows Alle Programme verfügen über eine Nachrichtenwarteschlange, und das Programm kann Nachrichten aus der Warteschlange abrufen.
Systemnachrichtenwarteschlange: Eine vom Betriebssystem verwaltete Nachrichtenwarteschlange, in der vom System generierte Nachrichten wie Maus- und Tastaturnachrichten usw. gespeichert werden.
Programmnachrichtenwarteschlange: Eine Nachrichtenwarteschlange, die zu jeder Anwendung (Thread) gehört und von der Anwendung verwaltet wird.
Wenn eine Maus-, Tastatur- usw. Nachricht generiert wird, wird die Nachricht zuerst in der Nachrichtenwarteschlange des Systems gespeichert. Anschließend findet das Betriebssystem basierend auf der gespeicherten Nachricht die Nachrichtenwarteschlange des entsprechenden Fensters und stellt sie zu die Nachricht in die Nachrichtenwarteschlange des Fensters.
Warteschlangennachrichten: Nachdem die Nachricht gesendet wurde, wird sie zunächst in die Warteschlange gestellt und dann über die Nachrichtenschleife abgerufen. Häufige Warteschlangennachrichten: Tastatur-, Maus-, Timer--Nachrichten usw.
Nachricht ohne Warteschlange: Suchen Sie nach dem Senden der Nachricht direkt die Nachrichtenverarbeitungsfunktion des Fensters und rufen Sie die Nachrichtenverarbeitungsfunktion zur Verarbeitung auf, ohne die Nachrichtenwarteschlange zu durchlaufen. Häufige Nachrichten außerhalb der Warteschlange: WM_PAINT, WM_SIZE usw.
Die allgemeine Nachrichtenschleife ist wie folgt:
void Message(HWND hWnd) { MSG nMsg = { 0 }; while (GetMessage(&nMsg, hWnd, 0, 0)) { TranslateMessage(&nMsg); DispatchMessage(&nMsg); if(nMsg.message == WM_PAINT) { char buff[30]={}; sprintf(buff,"处理消息%d\n",nMsg.message); WriteConsole(hOutput,buff,sizeof(buff),NULL,NULL); } } }
GetMessage/PeekMessage: aus dem Programm Nachrichten aus der Nachrichtenwarteschlange abrufen.
TranslateMessage: Übersetzt Nachrichten wie Tastendrücke auf der Tastatur in Zeichennachrichten.
DispatchMessage: Stellen Sie die übersetzte Nachricht erneut in die Nachrichtenwarteschlange des Programms.
GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax )
lpMsg: Zeiger auf die MSG-Struktur, die Nachrichteninformationen aus der Nachrichtenwarteschlange des Threads empfängt. hWnd: Das Handle des Fensters, dessen Nachricht abgerufen wird. Wenn der Wert NULL ist, ruft GetMessage Nachrichten für jedes Fenster ab, das zum aufrufenden Thread gehört, und die Thread-Nachricht wird über PostThreadMessage an den aufrufenden Thread gesendet.
wMsgFilterMin: Eine
Ganzzahl, die den minimalen abzurufenden Nachrichtenwert angibt. wMsgFilterMax: Eine Ganzzahl, die den maximalen abzurufenden Nachrichtenwert angibt.
Rückgabewert: Wenn die Funktion andere Nachrichten als WM_QUIT erhält, gibt sie einen Wert ungleich Null zurück. Wenn die Funktion eine WM_QUIT-Nachricht erhält, ist der Rückgabewert Null. Tritt ein Fehler auf, ist der Rückgabewert -1. Wenn beispielsweise hWnd ein ungültiges Fensterhandle oder lpMsg ein ungültiger Zeiger ist. Wenn Sie weitere
Fehlerinformationen erhalten möchten, rufen Sie bitte die Funktion GetLastError auf.
BOOL PeekMessage( LPMSG IpMsg, HWND hWnd, UINT wMSGfilterMin, UINT wMsgFilterMax, UINT wRemoveMsg );lpMsg: MSG-Strukturzeiger zum Empfangen von Nachrichteninformationen.
hWnd: Das Fensterhandle, dessen Nachricht überprüft wird.
wMsgFilterMin: Gibt die erste Nachricht im Nachrichtenbereich an, die überprüft werden soll.
wMsgFilterMax: Gibt die letzte Nachricht im Nachrichtenbereich an, die überprüft werden soll.
wRemoveMsg: Bestimmen Sie, wie die Nachricht verarbeitet wird. Dieser Parameter kann einen der folgenden Werte annehmen:
Wert | Bedeutung |
---|---|
PM_NOREMOVE | Nachdem PeekMessage verarbeitet wurde, wird die Nachricht nicht aus der Warteschlange entfernt. |
PM_REMOVE |
Nachdem die PeekMessage verarbeitet wurde, wird die Nachricht aus der Warteschlange entfernt. |
PM_NOYIELD |
Dieses Flag bewirkt, dass das System keine Threads freigibt, die darauf warten, dass das aufrufende Programm inaktiv wird. PM_NOYIELD kann frei in PM_NOREMOVE oder PM_REMOVE kombiniert werden. |
GetMessage和PeekMessage的主要区别在于:GetMessage是阻塞函数,它会在消息循环中会一直阻塞直到消息队列中出现了消息可以被获取,而PeekMessage是非阻塞函数,不管有没有获取到消息队列中的消息,它都会返回。PeekMessage更多用来检测消息队里中是否有消息,它的最后一个参数可以用来指定获取到消息后要不要把消息从消息队列中移除,通常情况下通过PeekMessage检测到消息队列有消息之后,再调用GetMessage区获取。
1、先在程序的消息队列中查找消息,如果有队列消息,就取出消息。
2、如果程序的消息队列中没有消息,向系统的消息队列获取属于本程序的消息。如果系统的消息队列中有属于本程序的消息,系统的消息队列会将消息分发到本程序的消息队列中。
3、如果系统的消息队列也没有消息,检查窗口需要绘制的区域是否需要重绘,如果发现有需要重绘的区域,产生WM_PAINT消息。
4、如果没有重新绘制区域,检查是否具有到时的定时器,如果有产生WM_TIMER定时器消息。
5、如果没有到时的定时器,整理程序的资源、内存等等。
LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM IParam )
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息特定信息。
IParam:指定附加的消息特定信息。
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
BOOL WINAPI PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
HWND_BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、 被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口
NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
LParam:指定附加的消息特定的信息。
返回值:如果函数调用成功,返回非零,否则函数调用返回值为零
1、SendMessage
发送消息到指定的窗口,并等候对方将消息处理,为阻塞函数,获取消息的执行结果后返回。主要需要发送非队列消息,发送的消息不经过消息队列。
2、PostMessage
发送消息到程序的消息队列,不管消息有没有被处理都会立即返回,用于队列消息的发送
Das obige ist der detaillierte Inhalt vonWin32 SDK-Grundlagen (11) Detaillierte Erläuterung der Nachrichtenwarteschlange und GetMessage/PeekMessage, SendMessage/Postmesage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!