サブクラス化してWM_LBUTTONDOWNメッセージを拾えば、それっぽいのは作れますね。
コールバック関数実装プラグイン hscallbk.dll for HSP3 が必要です。
http://chokuto.ifdef.jp/download/#hscallbk
#include "hscallbk.as"
#include "user32.as"
#define GWL_WNDPROC (-4)
#define WM_LBUTTONDOWN 0x0201
#define WM_LBUTTONUP 0x0202
#define WM_TIMER 0x0113
// コールバック関数用ダミー
#uselib ""
#func BtnWndProc "" int, int, int, int
Timer = 10 // タイマー呼び出し間隔ms
Vol = 0 // 音量を保存する変数
title ""+strf("音量:%d ", Vol)
// タイマー用
oncmd gosub *OnTimer, WM_TIMER
// コールバック関数作成(ウィンドウプロシージャ)
setcallbk Proc, BtnWndProc, *ButtonWndProc
// ボタン作成
button gosub "音量↑", *dummy : hwnd_up = objinfo(stat, 2)
// ウィンドウプロシージャを差し替えて、元のを保存しておく
SetWindowLong hwnd_up, GWL_WNDPROC, varptr(Proc)
oldWndProc_up = stat
button gosub "音量↓", *dummy : hwnd_down = objinfo(stat, 2)
// ウィンドウプロシージャを差し替えて、元のを保存しておく
SetWindowLong hwnd_down, GWL_WNDPROC, varptr(Proc)
oldWndProc_down = stat
stop
// タイマー処理
*OnTimer
if wparam == 0{
Vol++
}else : if wparam == 1{
Vol--
}
Vol = limit(Vol, 0, 100)
title ""+strf("音量:%d ", Vol)
return
// 差し替えるボタンのウィンドウプロシージャ
*ButtonWndProc
// ボタンが押されたとき
if callbkarg(1) == WM_LBUTTONDOWN{
// "音量↑" 用タイマーセット
if callbkarg(0) == hwnd_up{
SetTimer hwnd, 0, Timer, 0
// "音量↓" 用タイマーセット
}else : if callbkarg(0) == hwnd_down{
SetTimer hwnd, 1, Timer, 0
}
// ボタンが押し上げられたとき
}else : if callbkarg(1) == WM_LBUTTONUP{
// "音量↑" 用タイマー解除
if callbkarg(0) == hwnd_up{
KillTimer hwnd, 0
// "音量↓" 用タイマー解除
}else : if callbkarg(0) == hwnd_down{
KillTimer hwnd, 1
}
}
// 元のウィンドウプロシージャを呼び出す
if callbkarg(0) == hwnd_up{
CallWindowProc oldWndProc_up, callbkarg(0), callbkarg(1), callbkarg(2), callbkarg(3)
}else : if callbkarg(0) == hwnd_down{
CallWindowProc oldWndProc_down, callbkarg(0), callbkarg(1), callbkarg(2), callbkarg(3)
}
return
// ダミー
*dummy
return