0

ウィンドウメッセージがGetMessageによって返されることについて言及している 場所の中には、送信方法から派生した優先度の高いものから、ユーザー入力よりSendMessageも高いものがあります。ただし、これに関する信頼できるリファレンス、つまりMicrosoftからのリファレンスPostMessageは見つかりませんでした。明らかなページはそれを明示的に否定しているようで(メッセージはいくつかの例外を除いてFIFO順に処理されると言っています)、他の参照は見つかりませんでした。

ただし、優先順位があることを示唆するアプリケーションの動作があります(1秒ごとにいくつかのWM_USERスレッドメッセージが処理されますが、クリックが処理されるまでに数秒かかる場合があります)。ですから、信頼できる情報源から、アプリケーションを修正できるように、どのように動作することが期待されるかを知りたいと思います。

注:メッセージは。で送信されPostThreadMessageます。から出てくるメッセージを見ているGetMessageので、キューに入れられていないメッセージはここでは機能しません。スレッドメッセージとウィンドウメッセージの違いは、おそらく可能です。

注:アプリケーションは、特に重要な場合はWinCE5.0で実行されます。

4

1 に答える 1

2

ハンスの答えは、リンクされた MSDN のドキュメントと異なることを言っているわけではありません。

メッセージは、標準キューと同じように先入れ先出しの順序で処理されますが、メッセージなどのいくつかの特別な例外がWM_TIMERありWM_PAINTます。Hans は、このクラスのメッセージを「ウィンドウ状態から合成された」ものと呼んでいます。MSDN はそれらを明示的に呼び出すだけです。

WM_PAINTメッセージ、WM_TIMERメッセージ、およびメッセージを除いてWM_QUIT、システムは常にメッセージ キューの最後にメッセージをポストします。これにより、ウィンドウが適切な先入れ先出し (FIFO) シーケンスで入力メッセージを受け取ることが保証されます。ただし、メッセージWM_PAINTWM_TIMERメッセージ、およびWM_QUITメッセージはキューに保持され、キューに他のメッセージが含まれていない場合にのみ、ウィンドウ プロシージャに転送されます。さらにWM_PAINT、同じウィンドウの複数のメッセージが 1 つのWM_PAINTメッセージに結合され、クライアント領域のすべての無効な部分が 1 つの領域に統合されます。メッセージを結合するとWM_PAINT、ウィンドウがクライアント領域の内容を再描画しなければならない回数が減ります。

問題は、 で送信されたメッセージはSentMessageキューに入れられず、 で投稿されたメッセージはキューに入れられることPostMessage です。MSDN の同じ記事は、次のセクションで同じことを述べています。

キューに入れられていないメッセージは、システム メッセージ キューとスレッド メッセージ キューをバイパスして、すぐに宛先ウィンドウ プロシージャに送信されます。

[...]

非キュー メッセージを送信する関数には、、、、、およびBroadcastSystemMessageがあります。BroadcastSystemMessageExSendMessageSendMessageTimeoutSendNotifyMessage

「優先順位」はありません。ただし、説明する動作は簡単に説明できます。ほとんどの場合、WM_USERメッセージは関数の呼び出しによって送信されSendMessage、メッセージ キューをバイパスして、宛先ウィンドウのウィンドウ プロシージャにメッセージを直接送信します。SendMessage関数が戻る前にすぐに処理され、残りのキューを効果的にバイパスするため、より高い「優先度」で処理されているように見えます。

これにより、クリック イベントの処理に時間がかかる理由が説明されます。これは、クリック イベントが他のすべての入力メッセージと共にキューに押し込まれるため、ウィンドウはメッセージを処理するまで処理に取り掛からないためです。への呼び出しで直接送信されますSendMessage

重要な警告:私は Windows CE について何も知りません。あなたの質問は、あなたが具体的に話していることを示しています。ここで説明する動作は、Windows のデスクトップ バージョンでは正確ですが、その動作と Windows CE の動作に違いがあるかどうかはわかりません。何か問題があった可能性があります。

于 2012-05-18T12:19:03.607 に答える