HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0315
HK2メッセージが届いているか調べる2解決


HK2

リンク

2012/3/15(Thu) 22:43:17|NO.45431

ウィンドウにメッセージが届いているかどうかを調べたいのですが、
どのようにすれば調べれるでしょうか。

また、届いているなら、「wait 0」と「await 0」のどちらで処理をさせるといいでしょうか。


使用目的は、プログラムの空き時間にバックグラウンドで処理をすることです。

よろしくお願いします。



この記事に返信する


pizza

リンク

2012/3/17(Sat) 05:41:40|NO.45451

PeekMessageをPM_NOREMOVEで使ってメッセージキューのメッセージの有無を調べられます。

awaitとwaitは待ち時間0なら大差ないような?
ゲームとかならawaitの方が良いのかな?



HK2

リンク

2012/3/20(Tue) 21:11:31|NO.45524

回答ありがとうございます。

試してみました。

#uselib "user32.dll" #func PeekMessage "PeekMessageA" int,int,int,int,int #func SetTimer "SetTimer" int,int,int,int #func KillTimer "KillTimer" int,int #define WM_TIMER 0x00000113 #define NULL 0x00000000 #define PM_NOREMOVE 0x00000000 background=0//バックグラウンドでカウント messageRecieved=0//メッセージ受信回数 frame=0//画面に描画した回数。 nTimer=0//PeekMessageでのWM_TIMER取得回数 bTrueSection=0//PeekMessageでメッセージを受信した処理中か否や bFalseSection=0//空き時間処理中か否や bCalling=0//PeekMessage処理中か否や dim MSG,7//MSG構造体 SetTimer hwnd,1,1000,NULL//表示用のタイマー if(stat){//タイマーの作成に成功 oncmd gosub *timer,WM_TIMER//割り込みの設定 onexit *exit//終了時にタイマーを破棄させる。 } repeat bCalling=1 PeekMessage varptr(MSG),NULL,0,0,PM_NOREMOVE bCalling=0 if(stat){//メッセージあり bTrueSection=1 messageRecieved++ if(MSG.1==WM_TIMER){ nTimer++; } wait 0 bTrueSection=0 }else{//空き時間 bFalseSection=1 /*この行の先頭に/を追加すると、空き時間処理中に再描画する if((cnt&0xFF)==0){ gosub *timer } //*/ background++ bFalseSection=0 } loop *timer frame++ redraw 0 color 255,255,255:boxf:color:pos 0,0 mes "ウィンドウハンドル:"+hwnd mes "バックグランドカウンター:"+background mes "受信数:"+messageRecieved mes "描画数:"+frame mes "PeekMessageでのWM_TIMER取得数:"+nTimer mes "PeekMessage関数実行中か:"+bCalling mes "PeekMessageのメッセージ処理中か:"+bTrueSection mes "空き時間処理中か:"+bFalseSection redraw return *exit KillTimer hwnd,1 end

表示される各情報は次の意味を持たせています。
ウィンドウハンドル:そのまま、ウィンドウハンドルです。
バックグラウンドカウンター:PeekMessage関数が0を返したときにカウントされるカウンターの値です。
受信数:PeekMessage関数が0以外を返した回数。
描画数:表示されている情報が描画された回数です。
PeekMessageでのWM_TIMER取得数:PeekMessage関数がWM_TIMERを受け取った回数です。
PeekMessage関数実行中か:PeekMessage関数を呼び出してから戻っていなければ1になります。
PeekMessageのメッセージ処理中か:PeekMessage関数が0以外を返したときの条件分岐を実行中
空き時間処理中か:PeekMessage関数が0を返したときの条件分岐を実行中

これを実行中にメッセージをSendしたりPostしたりしました。

#uselib "user32.dll" #func SendMessage "SendMessageA" int,int,int,int #func PostMessage "PostMessageA" int,int,int,int screen 0,392,24 input h,200,24,11 pos 200,0 button "Send",*send pos 264,0 button "Post",*post pos 328,0 button "HSP",*hsp stop *Send SendMessage h,0x0113,1,0 title str(gettime(7)) stop *Post PostMessage h,0x0113,1,0 title str(gettime(7)) stop *hsp sendmsg h,0x0113,1,0 title str(gettime(7)) stop
入力ボックスにウィンドウハンドルを入れ、Send,Post,HSPと書かれたボタンを押すと、
指定のウィンドウにWM_TIMERメッセージを送信したりポストしたりします。
SendはSendMessage
PostはPostMessage
HSPはsendmsgを使用しています。

これでメッセージをSendすると、PeekMessage関数から戻ってくることなく、
メッセージが処理されてしまうのが少し気に入りませんが、
ほかに方法がないので、この方法を使いたいと思います。

pizzaさん、回答していただき、ありがとうございました。
また、このスレッドを読んていただいたり、考えていただいた方、ありがとうございました。

今回のPeekMessageについては、まだよく理解できていないので、
後日、この関数について質問することがあると思います。
その時も、どうかお願いします。



ONION software Copyright 1997-2023(c) All rights reserved.