dポイントプレゼントキャンペーン実施中!

私は今まで、SendMessageを行うと、受信側の処理が終わるまで送信側は一切のメッセージ処理を受け付けない(処理が終了するまで待ち状態)と信じていました。

がしかし・・・実際には待っている間に自分のメッセージを処理することがあるようなのです。

■環境
VisualStudio2005 C/C++

■状況
「IntelliPointMouseのドライバ?であるipoint.exeを組み込んで」いる場合、SendMessage中にウィンドウの更新が発生します。

例)
SendMessage(hwnd, msg, 0, 0) <--- SendMessageから制御が返ってきて
いない状態で、メインスレットのOnPaint
が呼び出されることがある・・・
(コールスタックで確認・・・)

そこで・・・ 以下のような対応を行いました。
SendMessageTimeout(hwnd, msg, 0, 0, SMTO_BLOCK, 10000, ret);

SMTO_BLOCK属性を指定して、SendMessageを行ったところ、現在のところ
上記のような不可解な現象は発生していません。

現状では特定のドライバが起因している気がしますが、ソフトとしては
恒久的な対応を行う必要あると考えています。

今までSendMessage中になんらかのメッセージ処理が発生することは
考えていませんでしたが、そういったことを本来ありえるのでしょうか?

以上、簡単な説明ですが、何か情報ありましたら、ご教授よろしくお願いします。

A 回答 (1件)

こちらに書いてありますが、


http://yokohama.cool.ne.jp/chokuto/urawaza/api/S …
引用「受信側スレッドがメッセージを処理するまで送信側スレッドの実行は停止されます。ただし、メッセージ処理を待つ間でも、送信側スレッドは自身に送られてきたキューイングされないメッセージは処理されます。これを防ぐには SendMessageTimeout 関数呼び出しで SMTO_BLOCK フラグを指定します。」
と言うことで、対処されたSMTO_BLOCKでWM_PAINTメッセージをブロックできていると思います。
ただし、恒久的にはWM_PAINTメッセージをブロックするのではなく、SendMessage中でも画面更新できるのが望ましいです。
    • good
    • 1
この回答へのお礼

ご教授ありがとうございます。

そうですか、やはりこういう事象を考慮してプログラミングすべき
なんですね。

今回はどうもご回答ありがとうございました。 m(__)m

お礼日時:2009/04/14 18:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!