ハンスの答えは、リンクされた MSDN のドキュメントと異なることを言っているわけではありません。
メッセージは、標準キューと同じように先入れ先出しの順序で処理されますが、メッセージなどのいくつかの特別な例外がWM_TIMER
ありWM_PAINT
ます。Hans は、このクラスのメッセージを「ウィンドウ状態から合成された」ものと呼んでいます。MSDN はそれらを明示的に呼び出すだけです。
WM_PAINT
メッセージ、WM_TIMER
メッセージ、およびメッセージを除いてWM_QUIT
、システムは常にメッセージ キューの最後にメッセージをポストします。これにより、ウィンドウが適切な先入れ先出し (FIFO) シーケンスで入力メッセージを受け取ることが保証されます。ただし、メッセージWM_PAINT
、WM_TIMER
メッセージ、およびWM_QUIT
メッセージはキューに保持され、キューに他のメッセージが含まれていない場合にのみ、ウィンドウ プロシージャに転送されます。さらにWM_PAINT
、同じウィンドウの複数のメッセージが 1 つのWM_PAINT
メッセージに結合され、クライアント領域のすべての無効な部分が 1 つの領域に統合されます。メッセージを結合するとWM_PAINT
、ウィンドウがクライアント領域の内容を再描画しなければならない回数が減ります。
問題は、 で送信されたメッセージはSentMessage
キューに入れられず、 で投稿されたメッセージはキューに入れられることPostMessage
です。MSDN の同じ記事は、次のセクションで同じことを述べています。
キューに入れられていないメッセージは、システム メッセージ キューとスレッド メッセージ キューをバイパスして、すぐに宛先ウィンドウ プロシージャに送信されます。
[...]
非キュー メッセージを送信する関数には、、、、、およびBroadcastSystemMessage
があります。BroadcastSystemMessageEx
SendMessage
SendMessageTimeout
SendNotifyMessage
「優先順位」はありません。ただし、説明する動作は簡単に説明できます。ほとんどの場合、WM_USER
メッセージは関数の呼び出しによって送信されSendMessage
、メッセージ キューをバイパスして、宛先ウィンドウのウィンドウ プロシージャにメッセージを直接送信します。SendMessage
関数が戻る前にすぐに処理され、残りのキューを効果的にバイパスするため、より高い「優先度」で処理されているように見えます。
これにより、クリック イベントの処理に時間がかかる理由が説明されます。これは、クリック イベントが他のすべての入力メッセージと共にキューに押し込まれるため、ウィンドウはメッセージを処理するまで処理に取り掛からないためです。への呼び出しで直接送信されますSendMessage
。
重要な警告:私は Windows CE について何も知りません。あなたの質問は、あなたが具体的に話していることを示しています。ここで説明する動作は、Windows のデスクトップ バージョンでは正確ですが、その動作と Windows CE の動作に違いがあるかどうかはわかりません。何か問題があった可能性があります。