申し訳ありません。
「WH_MOUSE」ではなく「WH_MOUSE_LL」でした。
modclbk3.hspを使わせていただき、実際にやってみました。
#include "modclbk3.hsp"
#define NULL 0
#define WH_MOUSE_LL 14
#define WM_MOUSEWHEEL 0x020A
#uselib "user32.dll"
#cfunc SetWindowsHookEx "SetWindowsHookExA" int, sptr, int, int
#func UnhookWindowsHookEx "UnhookWindowsHookEx" int
#cfunc CallNextHookEx "CallNextHookEx" int, int, int, int
gmousew = 0; 全ウィンドウ対応mousew
cbl = *LowLevelMouseProc;
newclbk3 clbkptr, 3, cbl;
hhook = SetWindowsHookEx( WH_MOUSE_LL, clbkptr, NULL, 0 ); // マウス操作を感知した場合ウェイト中に割り込みが入る
onexit goto *hookend;
*main
redraw 0;
color 255, 255, 255:boxf;
color 0, 0, 0:pos 0, 0;
mes "フックして取得したホイール値\t"+gmousew; // ホイール情報の表示
mes "HSP標準命令で取得したホイール値\t"+mousew;
redraw 1;
gmousew = 0; // ウェイト(割り込み)の直前でホイール値の初期化
await 500; // 表示がわかりやすいように長めのウェイトにする
goto *main;
// フックのコールバック
*LowLevelMouseProc
dupptr Mstate, lparam, wparam*4, 4;
// Mstate(0)=フックコード(nCode) Mstate(1)=メッセージ識別子(wParam) Mstate(2)=メッセージデータ(lParam)
if( Mstate(0) < 0 ) {
// フックコードが0未満の場合はフックを中止して制御を元に戻さなければいけない。
return CallNextHookEx( hhook, Mstate(0), Mstate(1), Mstate(2) );
}
if( Mstate(1) == WM_MOUSEWHEEL ) {
dupptr lp, Mstate(2), 24, 4; // lParamはMSLLHOOK構造体へのポインタが入っている
gmousew = lp(2)>>16; // MSLLHOOK構造体のメンバmouseDataの上位ビットがホイール情報
}
else {
gmousew = 0;
}
return CallNextHookEx( hhook, Mstate(0), Mstate(1), Mstate(2) ); // フックしたデータをそのまま返す
*hookend
UnhookWindowsHookEx hhook; // フックの終了
end;
細かい流れはコメントの説明でだいたいわかると思います。
フックが不要になったらUnhookWindowsHookExを使うという所だけは
忘れないようにしてください。