すみません、動作確認した時の消し忘れミスです。
lp(2)の値を確認すれば押しっぱなし判定できるかと思っていたのですが
キーを押している間、常に0だったので意味がありませんでした。
なので、押しっぱなし判定する場合は
フックのコールバックを下記のようにしてみて下さい。
// フックのコールバック
*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) );
}
// ほとんどのキー入力はWM_KEYDOWNだが、ALTなどはWM_SYSKEYDOWNになる
if( (Mstate(1) == WM_KEYDOWN) || (Mstate(1) == WM_SYSKEYDOWN) ) {
kcode_old = kcode; // 前回のキーコードを記録
dupptr lp, Mstate(2), 24, 4; // lParamはKBDLLHOOK構造体へのポインタが入っている(今回は不要)
// lp(0)が仮想キーコード、lp(1)がハードウェアスキャンコード、lp(2)がキーの押しっぱなしなどの細かい情報群
// lp(3)はタイムスタンプ、lp(4)は追加情報(これは32ビットか64ビットかでサイズが変わる)
kcode = lp(0);
if( (kcode == kcode_old) && (gkey != 0) ) {
// 今回のコードと前回のコードが一致し、前回もキーを押していた場合
gkey = 2; // キーを押し続けているか判定
}
else {
gkey = 1; // キーを押したか判定
}
///////////////////////////////////////////////////////////////////
lp2 = MapVirtualKey( kcode, 0 ) << 16; // おまけでキー名取得
GetKeyNameText lp2, keyname, 64; // キー名取得本体
///////////////////////////////////////////////////////////////////
}
else {
gkey = 0;
///////////////////////////////////////////////////////////////////
sdim keyname, 64; // おまけを初期化
///////////////////////////////////////////////////////////////////
}
return CallNextHookEx( hhook, Mstate(0), Mstate(1), Mstate(2) ); // フックしたデータをそのまま返す
よく見たら、コールバックも「LowLevelMouseProc」
マウスフックした時の名前のままでしたね。
色々雑で申し訳ありません。