
No.3ベストアンサー
- 回答日時:
>OnTimer()時には簡単にメッセージが受け取れないのですね。
というか、OnTimerも、WM_TIMERというメッセージのハンドラです。
メッセージ処理の間には、他のメッセージは通常受け取れません。
メッセージキューの中に該当のメッセージが存在するかどうかを調べるのがPeekMessageになります。
なので、実は最初に上げられたソースのように、中身の
処理がほとんどないような状態だとPeekMessageでは
取れないと思ってください。
OnTimerがすぐに終了してしまいますから。
なので、#2の方のフラグを使う方法になります。
PeekMessage自体の使い方としては、メッセージキューに該当メッセージの有無のチェックです。
MSG msg;
PeekMessage( &msg, *this, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE);
みたいにすれば、WM_LBUTTONDOWNがメッセージキューにあるかどうかを確認できます。
回答ありがとうございます。
SDKでダブルクリックとシングルクリックを区別する方法として、質問のようなコードがあったのが質問のきっかけです。
http://www.hidecnet.ne.jp/~sinzan/tips/win/win_t …
思っていたより難しかったので、今回はPeekMessage関数というものの存在を知るに留めたいと思います。
whileでの長い時間がかかる処理中にメッセージを受け取るために使ったりするようですね。
#3の関数の使い方は、1例として大変良く分かりました。
No.4
- 回答日時:
こんばんは。
#3さんが仰るように PeekMessage を使う方法だと、OnTimer を
処理している僅かなタイミングの間にキューに溜まったメッセージ、
或いは大量にメッセージが発生した状態でキューが渋滞し、偶然に
WM_TIMER より後に積まれていたクリックしか検知できません。
私が挙げた方法だと、OnTimer が来るまでの間に処理された物に
なり、どちらの時系列が欲しいのかによってロジックも変わって
くると思います。
例えばタイマーを2周回す構造にして、1周目~2周目間で発生した
クリックかどうかを2周目の OnTimer でチェックする、または1周目
の OnTimer でフラグを立て2周目 OnTimer ではフラグリセット、
OnClick 側で1周目のフラグをチェックして処理分岐…
とすれば、2周目で処理するメッセージは過去のメッセージですが
1周目から見れば未来のクリックを処理する訳で…って詭弁ですね。
しかも結局フラグ制御だなぁ(苦笑)
フラグ制御以外となると、少々強引ですが、一定間隔でループする
スレッドを作りタイマーに見立てるのは如何?
CWinThread で作ればメッセージキューを持っているので、OnClick
でスレッドに対して PostThreadMessage すれば似たような動きを
実装できるかも知れません。
回答有難うございます。
#3のお礼欄に書いたことが今回の質問のきっかけです。
元々そう難しくないと思って質問しましたが、私にとっては思ったより厄介でした。
No.1
- 回答日時:
回答有難うございます。
OnTimer()時には簡単にメッセージが受け取れないのですね。
そんなことも知らずに質問してしまいました。
PeekMessage()について調べましたが、いつものように良く分かりませんでした。
とりあえず、すぐに知りたい訳ではないのでおいおい調べていきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSで応答不要のメッセージボッ...
-
VBSの処理中一旦処理を止めて再...
-
PostMessageの連続送信
-
VBA、UserFormを前面に出力して...
-
エクセルVBAでクリップボード内...
-
ACCESS側からEXCELの書式を設定...
-
Application.ScreenUpdating=Fa...
-
Excel VBA 実行中に一瞬フリー...
-
キーボード入力、マウス操作を...
-
Excel VBA 自動的に閉じるMsgBox
-
メッセージボックスのボタン名変更
-
シャットダウン時のExcel強制終...
-
ボタンが押された事を検知する...
-
Excel VBA で処理中断(DoEvents...
-
「shift」ボタンが押された時。
-
サスペンド(休止やスタンバイ...
-
VB6でフォームをリロードしたい
-
イベントハンドラ処理が終了し...
-
ループを使わずに、特定時間に...
-
VB Loopを一時停止し再開あるい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
VBA kernel32 の意味
-
メッセージボックスのボタン名変更
-
ACCESS側からEXCELの書式を設定...
-
VBSで応答不要のメッセージボッ...
-
VBA、UserFormを前面に出力して...
-
【C#】 あるイベントから別イ...
-
Excel VBA で処理中断(DoEvents...
-
PostMessageの連続送信
-
ボタンが押された事を検知する...
-
Application.ScreenUpdating=Fa...
-
エクセルVBAでクリップボード内...
-
VB Loopを一時停止し再開あるい...
-
起動後直に実行するコードはど...
-
DirectX環境下での方向キー同時...
-
Excel VBA 実行中に一瞬フリー...
-
OSシャットダウン時の常駐アプ...
-
マウスのクリックを無視したい
-
エクセルVBAで
-
メッセージボックスの表示につ...
おすすめ情報