このようなモジュールを作ってみました。
よろしければお使い下さい。
//////////////////////////////////////////////////
// getkey_ex //
// ky() == 1 押した瞬間 //
// ky() == -1 放した瞬間 //
// ky() >= 1 押している間増え続ける //
// ky() == 0 押されていない //
//////////////////////////////////////////////////
#module
#deffunc getkey_ex_ini array kyind_
kyindmax=length(kyind_)
dim kyind,kyindmax
repeat kyindmax
kyind(cnt)=kyind_(cnt)
loop
dim ky@,256
return
#deffunc getkey_ex
mref st,64 : st=ginfo(2) //statにアクティブなウィンドウIDが入る
if st>=0 : {
repeat kyindmax
getkey kytmp,kyind(cnt)
if kytmp=1 : {
ky@(kyind(cnt))++
} else {
if ky@(kyind(cnt))>0 : ky@(kyind(cnt))=-1 : else : ky@(kyind(cnt))=0
}
loop
}
return
#global
//////////////////////////////////////////////////
// 制作開始日 2009/05/12 01:24 //
// 最終更新日 2009/05/31 06:12 //
// by VGM (ご自由にお使い下さい) //
//////////////////////////////////////////////////
//以下サンプルプログラム
#const VK_ESCAPE 0x1B ;ESC
#const VK_LEFT 0x25 ;←
#const VK_UP 0x26 ;↑
#const VK_RIGHT 0x27 ;→
#const VK_DOWN 0x28 ;↓
dim kyind,5 //必ず監視するキーの数で初期化
kyind=VK_LEFT,VK_UP,VK_RIGHT,VK_DOWN,VK_ESCAPE //監視するキー
getkey_ex_ini kyind //最初に実行(監視するキーを変更する時に実行)
cx=320 : cy=240
repeat
getkey_ex
st=stat
//statにアクティブなウィンドウIDが入る
if ky(VK_ESCAPE) : end //[Esc]
if (ky(VK_LEFT)=1) or ((ky(VK_LEFT)>=30) and (ky(VK_LEFT)\5=0)) : cx-=10
//↑押した瞬間と一定時間経過後に一定時間ごとに移動
if ky(VK_UP)=1 : cy-=10
//↑押した瞬間だけ移動
if (ky(VK_RIGHT)=1) or (ky(VK_RIGHT)>=50) : cx+=10
//↑押した瞬間と一定時間経過後移動
if ky(VK_DOWN)=-1 : cy+=10
//↑放した瞬間だけ移動
redraw 2 : color : boxf : color 255,255,255 : pos cx,cy : mes "o"
pos 0,0 : mes "cx "+cx+" / cy "+cy
repeat length(kyind)
mes "key "+kyind(cnt)+" / "+ky(kyind(cnt))
loop
mes "stat (winID) = "+st
redraw 1 : await 30
loop