回答ありがとうございます。
試してみました。
#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については、まだよく理解できていないので、
後日、この関数について質問することがあると思います。
その時も、どうかお願いします。