• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PeekMessage()について)

WindowsフォームアプリケーションでのPeekMessage()の使い方

このQ&Aのポイント
  • Windowsフォームアプリケーションで、ループさせたいイベント内で別のイベントを行いたい場合にはPeekMessage()を使用します。
  • ただし、PeekMessage()の使い方に注意が必要です。
  • アプリケーション起動後、button1をクリックし、後にbutton2をクリックしようとすると代わりにbutton1がクリックされる現象が発生しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ボタンも「ウィンドゥハンドルを持つ、ウィンドゥの1つ」だから PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); ってやると「現在のウィンドゥ」つまり「button1のウィンドゥ」に対してディスパッチとメッセージ送信するよ。 つまり「button2をクリックするとbutton1に通知される」よ。 >ループさせたいイベント(button1)中に、button2のイベントを行いたい こういう時は http://wikiwiki.jp/dxlibfunc/?%B4%D8%BF%F4%2FProcessMessage とかを使おう。 C++Builderの場合は http://www.geocities.co.jp/siliconvalley/6071/technic/26.html を使う。 VC++の場合は、ループの中で Sleep(0); ってやればオッケー。 ともかく、イベント処理の中で、PeekMessageやDispatchMessageをやるのはナンセンス。

miyaneya0
質問者

お礼

回答有り難うございます。 VS2010C++なのでSleep(0)を使いましたがうまくいきません。 改めてSleep(0)について質問しようと思います。

その他の回答 (1)

回答No.2

当然だけど、ProcessMessage()や、Application->ProcessMessages()や、Slep(0)をループ内で呼ぶと、button1のイベント処理中に更にbutton1が押せてしまい、button1を押せば再帰的にイベントが呼ばれるので注意しよう。 再帰的に呼ばれては困る場合には、ループに入る前にbutton1を非アクティブにするか、イベント処理関数に飛んでこないように工夫しないといけない。当然、ループから抜けたら、元に戻すのを忘れずに。

miyaneya0
質問者

お礼

更なるご指示ありがとうございます。 参考にさせて頂きます。