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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/01/23 17:13
- クラシック 曲名を教えてください! 1 2022/08/10 23:05
- Photoshop(フォトショップ) 写真に日付を入れるのがそんなに大変か 9 2023/07/22 14:38
- C言語・C++・C# 必ずyou bet と表示されます 2 2023/07/28 22:19
- iOS Gragebandでのみ左クリックが有効にならない 1 2022/08/19 13:18
- その他(ブラウザ) Microsoft edgeのスクロールバーについて 2 2022/09/19 16:56
- その他(IT・Webサービス) ANDROIDタブレットでZOOMのテストサイトを開いてもテストが始まりません https://ww 1 2023/08/26 16:31
- ノートパソコン windows11フォトビューア 4 2023/07/07 18:35
- HTML・CSS トリミングで表示した画像をクリックで元どおりにしたい 3 2022/12/16 18:49
- その他(Microsoft Office) Microsoft Edgeの「関心のあるカテゴリ」を表示させるには。 1 2023/03/16 18:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
メッセージボックスのボタン名変更
-
Application.ScreenUpdating=Fa...
-
エクセルVBAでクリップボード内...
-
ACCESS側からEXCELの書式を設定...
-
vb.net イベントが完全に終了...
-
VBA kernel32 の意味
-
VC++6.0 CDateTimeCtrl の暴走...
-
B列に特定の文字列が入っている...
-
VB6 コマンドボタン クリック...
-
ボタンが押された事を検知する...
-
VBA、UserFormを前面に出力して...
-
VBA メッセージボックスを自動...
-
VC++2008にて、画面の動的変更...
-
起動後直に実行するコードはど...
-
Excel VBA 自動的に閉じるMsgBox
-
MFCのメニューバーのイベント取得
-
シャットダウン時のExcel強制終...
-
VB.NETのUsingキーワードの使い方
-
MFCのワーカースレッドとUIスレ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBSの処理中一旦処理を止めて再...
-
VBSで応答不要のメッセージボッ...
-
ACCESS側からEXCELの書式を設定...
-
VBA メッセージボックスを自動...
-
Application.ScreenUpdating=Fa...
-
VBA kernel32 の意味
-
エクセルVBAでクリップボード内...
-
Excelのワークシートに行を挿入...
-
Excel VBA で処理中断(DoEvents...
-
【C#】 あるイベントから別イ...
-
手動かプログラムでの起動かの判断
-
ASP.NETでのメッセージ画面を出...
-
Excel VBA 自動的に閉じるMsgBox
-
シャットダウン時のExcel強制終...
-
VBA、UserFormを前面に出力して...
-
<input type="file">タグで「キ...
-
Excel VBA 実行中に一瞬フリー...
-
「キャンセル」ボタン付きの処...
-
EXCEL VBA「Application.Displa...
おすすめ情報