気が向いたので完成型を作ってしまいました。
最初のやつはバイナリで保存していましたが、テキストでログファイルを
作成しながら処理するように変更しています。
csvで出力しますので、Excelなどでも処理しやすいと思います。
初心者とのことですので、これで解決とせず1つ1つリファレンスを見て
何をしているのか覚えてみてください。
#packopt name "keylog"
#packopt hide 1
title "キーの状態を記録"
screen 0,480,480,0,ginfo_dispx/2-240,ginfo_dispy/2-260
t=3600 // 初期値(1時間=3600)
color 0,0,0: boxf // 黒で全体をクリア
color 0,255,255 // 文字色
pos 32,32: mes "実行する秒数を入力してスタートボタンを押してください。"
pos 192,80: input t,100,20,5
objsize 160,40
pos 160,128: button goto "スタート",*main
stop
*main
clrobj // オブジェクトをクリア
t=t*10 // 秒→0.1秒単位にする
i=0 // カウンタ初期化
log="時間(0.1秒),A,B,C\n" // 文字列型にしておく(ログ用)
notesel log // メモリノートパッドの対象にしておく
// ループ処理
repeat t
i++ // カウンタ
// キーの状態を取得
getkey a,65 // A
getkey b,66 // B
getkey c,67 // C
// 結果をテキストで追記していく
log+=strf("%06d",i)+","+str(a)+","+str(b)+","+str(c)+"\n"
redraw 0 // 仮想画面に描画開始
color 0,0,0: boxf // 黒で全体をクリア
color 255,255,255: pos 112,16 // 文字の色と描画開始位置
mes "A:"+a+" B:"+b+" C:"+c+"\n経過時間: "+i/10+" 秒 ("+i+" / "+t+")"
// ログプレビュー
color 0,255,255: mes "----------------------------------"
if i>22 { j=22 } else { j=i }
repeat j
noteget stmp1,cnt+i-j+1 // 1行読み出し
split stmp1,",",stmp2 // 表示用に分割する
mes stmp2(0)+"\tA:"+stmp2(1)+" B:"+stmp2(2)+" C:"+stmp2(3) // 表示
loop
redraw 1 // 画面に反映
await 100 // 0.1秒待つ
loop
// 時間分ループするとここから下が実行される
// ダイアログを出してログを保存するか問う
dialog "処理が完了しました。\nログをファイルに保存しますか?",2,"完了"
if stat=7 { goto *exit } // [いいえ]なら終了
*save
// 保存ダイアログ
dialog "csv",17,"csvファイル"
// キャンセルなら何もせず終了
if stat=0 { goto *exit }
// 保存ファイルのフルパス
stmp1=refstr
strrep stmp1,".csv","" // 二重拡張子にならないよう一旦拡張子を除去
stmp1=stmp1+".csv" // 拡張子追加
// ファイルが存在するか確認
exist stmp1
if strsize!-1 {
dialog stmp1+"\n同名のファイルが存在します。上書きしてよろしいですか?",2,"上書きの確認"
if stat=7 { goto *save } // [いいえ]なら保存ダイアログに戻る
}
// ファイルに保存して終了
notesave stmp1
dialog stmp1+"\n上記に保存しました。アプリケーションを終了します。",0,"保存完了"
*exit
end