
while(true)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT)
break;
DispatchMessage(&msg);
if(!GetMessage(&msg,NULL,0,0))
{
}
}
else
{
}
これはpeekMessageがメッセージを取り出してメッセージがあったら
if(msg.message==WM_QUIT)
break;
DispatchMessage(&msg);
if(!GetMessage(&msg,NULL,0,0))
を実行して、GetMessage()で待機してもし、メッセージがWM_QUITならGetMessageにWM_QUITのメッセージを渡してメッセージが消えてPeekMessageはメッセージキューがないため、0を返し永遠にelseを繰り返すという認識でよろしいのですか?
あと、while(true)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(!GetMessage(&msg,NULL,0,0))
{
}
if(msg.message==WM_QUIT)
break;
DispatchMessage(&msg);
}
else
{
}
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))がWM_QUITのメッセージで
そしてメッセージが消えてGetMessageで待機状態になるということでよろしいのでしょうか?ご教授お願いします。
No.1ベストアンサー
- 回答日時:
> これはpeekMessageがメッセージを取り出してメッセージがあったら
> if(msg.message==WM_QUIT)break;
> DispatchMessage(&msg);
> if(!GetMessage(&msg,NULL,0,0))を実行して、
> GetMessage()で待機して
ここまでは字面的にはOK。
但し、Peekした時点で取り出したメッセージはキューから消えてます。
下記の書き方からすると、実は理解が怪しいのかも。
> メッセージがWM_QUITなら
"GetMessageで取り出したメッセージが"なら、GetMessageが0を返すのでOKです。
(この時点でPeekは既に無関係)
> GetMessageにWM_QUITのメッセージを渡してメッセージが消えて
意味が理解できませんでした。
ここでGetMesssageにWM_QUITのメッセージを渡すようなことはできません。
Peek/GetMessageの引数msgはシステムのキューからメッセージを取得するもので、
受け渡したりなどはできません。(キューに残すことは可能ですがそうもなっていません)
このソースでは、PeekとGetでそれぞれ別のメッセージを消します。(各1つ、計2つキューから取り出されます)
また、PeekMessageした結果はDispatchされないままに失われました。(普通に考えればバグ)
> PeekMessageはメッセージキューがないため、
> 0を返し永遠にelseを繰り返すという認識でよろしいのですか?
メッセージキューは、そのプログラムが動けばOSから勝手にがしがし追加されるでしょうから、
永久にelseということはないでしょう。根本的な動作が理解できていない状態でしょうか。
# このソースだと、空白の部分の実装にもよりますが、CPU使用率あがりそう。
# 誰が書いたソースですか?ゲーム用のサンプルコードとか読まれてますか?
> if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))がWM_QUITのメッセージで
何を書かれているか不明ですが、否でしょう。
> そしてメッセージが消えてGetMessageで待機状態になる
何を書かれているか不明ですが、字面からの推測ではおそらく。
こちらも、普通に考えればバグってます。
何がしたいのか良く分からないコードです。
# 要求や省略部分の実装などにもよりますが、前回質問も含め、
# 不適切か不具合を含んだもの、注意して書くべきものなどを列挙されているような…
# ずばり、目的は何で、何がされたいのでしょうか。
# ・ゲーム用のサンプルコードを読み漁っている?
# ・試行錯誤しているがうまく動かない?
ゲームプログラムのサンプルを試しここ変えたらどうなるかな?と打ってみたらこうなって、なぜGetMessageを入れたらこうなるのかな?そしてなぜこういう結果になったのかわからなくなったので質問させていただきました。
No.6
- 回答日時:
>本のこと何ですけど、Win32API完璧マスタ(CQ出版)という本を読んでいます。
調べたりするのですがそれでもわからなくて。。。じゃあ、先ほど紹介した「APIで学ぶWindows徹底理解」を読んでみてはどうでしょう?この本はメッセージキューとかの仕組みが図入りで説明されてますので、イメージしやすいと思います。
http://software.nikkeibp.co.jp/software/backno/0 …
APIの詳細は載っていないですが、OSの仕組みの解説は丁寧です。
アマゾンのレビューも悪くない評価です。
http://www.amazon.co.jp/API%E3%81%A7%E5%AD%A6%E3 …
No.5
- 回答日時:
小言。
やたらと同じ質問を中途半端に締め切って質問するのは、「マルチポスト」に限りなく近いです。
http://help.okwave.jp/okwave/beginner/prohibitio …
この掲示板は、直接関係の無い人でも質問内容と回答を参考にしてもらうのを主旨として運営されていますので、一つの質問で完結するのがベストな使い方です。
http://help.okwave.jp/okwave/beginner/netiquette …
マナー的には、やたら締め切るのも印象が悪いですね。
で一番悪いのが、ちゃんとWindowsAPIの本を読んだり資料を調べてないことです。
こう言うのとか
http://wisdom.sakura.ne.jp/system/winapi/index.h …
こんなの
http://software.nikkeibp.co.jp/software/backno/0 …
ちゃんと読みましたか?
すみませんでした。確かに締め切りすぎたかもしれないです。
本のこと何ですけど、Win32API完璧マスタ(CQ出版)という本を読んでいます。調べたりするのですがそれでもわからなくて。。。
No.2
- 回答日時:
>>PeekMessageはメッセージキューがないため、0を返し永遠にelseを繰り返すという認識でよろしいのですか?
PeekMessage(~~PM_REMOVE)
としてるので、PeekMessage通過後はメッセージキューは消える。
DispatchMessage()でPeekMesssage()で拾って消したメッセージを
再送出してる。
それをGetMessageで拾う。
A.結論はこれだけ見てもメッセージキューが空なのかどうかはわかりません。
>そしてメッセージが消えてGetMessageで待機状態になるということでよろしいのでしょうか?
PeekMessage(~~PM_REMOVE)
としてるので、PeekMessage通過後はメッセージキューは消える。
GetMessageはメッセージキューが空ならメッセージがくるまで待機する。
メッセージが飛んできたらDispatchMessage()でGetMessageしたメッセージを
再送出してる。
A.メッセージキューが空なら待機します。
正直要点が何なのかわからないです。何をしたいのかさっぱり。
勉強レベルのようですが、書籍を見るなりなんなりしたほうが
いいかもしれませんよ。
あとログ出し。これで一発でわかることを質問してます。
回答ありがとうございます。あるサンプルを元に改造してみておかしいな?と思ったので質問させていただきました。
>DispatchMessage()でPeekMesssage()で拾って消したメッセージを
>再送出してる。
>それをGetMessageで拾う。
だとWM_QUITを返してきたときif(msg.message==WM_QUIT)が通ると思うのですが、どうなのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- JavaScript javascriptで入力フォームが空欄の時にアラートによるエラーを出すコードを書いています。 2 2023/06/13 17:58
- Excel(エクセル) エクセルVBA Msgboxでの変数の活用 4 2023/07/23 08:33
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- PHP php ログイン 1 2022/11/01 00:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SetWindowText関数について
-
vbaから他のアプリを終了
-
windowsメールスロットについて...
-
VB6でシャットダウン、ログオフ...
-
キーボード入力をHSPでさせたい...
-
他のウィンドウのボタンを自動...
-
点滅で知らせる方法
-
デスクトップ上のアイコンの位...
-
メッセージハンドラ
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
コントロールの書式設定で、“コ...
-
グラフの交点の求め方(Excel)
-
Minecraft 統合版(PC)の描画距...
-
VBAのフォント変更(エクセルか...
-
TextBoxに文字を書いても表示さ...
-
【C#】別フォームも同時に閉じ...
-
コンボボックス内の文字サイズ変更
-
matlab-図形表示
-
エクセルである行が急に消えて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
msgboxの表示位置
-
メッセージボックスの選択ボタ...
-
SetWindowText関数について
-
他のウィンドウのボタンを自動...
-
VB.netでFindWindowExやると・...
-
デスクトップ上のアイコンの位...
-
メッセージハンドラ
-
VBAでコントロールのハンドルを...
-
システム例外のメッセージを変...
-
VBでRegisterWindowMessage関数...
-
VC++(MFC)でタスクバーに常駐し...
-
VBA 複数セルが空白なら印刷さ...
-
16進数入力制限方法
-
グローバルフック(SetWindowsH...
-
マウスホイールをフックしたい
-
WM_NCLBUTTONUPについて
-
キーボード入力をHSPでさせたい...
-
点滅で知らせる方法
-
チェックボックスのキーダウン...
おすすめ情報