- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PeekMessage()について)
WindowsフォームアプリケーションでのPeekMessage()の使い方
このQ&Aのポイント
- Windowsフォームアプリケーションで、ループさせたいイベント内で別のイベントを行いたい場合にはPeekMessage()を使用します。
- ただし、PeekMessage()の使い方に注意が必要です。
- アプリケーション起動後、button1をクリックし、後にbutton2をクリックしようとすると代わりにbutton1がクリックされる現象が発生しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ボタンも「ウィンドゥハンドルを持つ、ウィンドゥの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をやるのはナンセンス。
その他の回答 (1)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
回答No.2
当然だけど、ProcessMessage()や、Application->ProcessMessages()や、Slep(0)をループ内で呼ぶと、button1のイベント処理中に更にbutton1が押せてしまい、button1を押せば再帰的にイベントが呼ばれるので注意しよう。 再帰的に呼ばれては困る場合には、ループに入る前にbutton1を非アクティブにするか、イベント処理関数に飛んでこないように工夫しないといけない。当然、ループから抜けたら、元に戻すのを忘れずに。
質問者
お礼
更なるご指示ありがとうございます。 参考にさせて頂きます。
お礼
回答有り難うございます。 VS2010C++なのでSleep(0)を使いましたがうまくいきません。 改めてSleep(0)について質問しようと思います。