キーボードフックとkeybd_event

[戻る]
key 2003/12/28(日) 18:30:14
環境は win2k sp4 vc++6.0 sdk です。
はじめまして。キーボード関係のソフトを作ろうとして壁にぶつかってしまいました。
キー入力をフックして同じキーをプログラム的に数回押すというプログラムなのですが、ソース
的には1回のキーダウンによって4回キー入力が実行されるはずなのところ、実行すると3回しか
されません。つまり'a'を押すと"aaa"となります。
しかもsssの値(*(A))はキーダウンするごとに1順してしまいます。つまりフックプロシージャ
が6回呼ばれている?
さらに2キー同時押しで無限ループに突入してしまいます。
正直意味がわかりません。
*(B)のループ回数だけキー入力させるにはどうすればいいのでしょうか?よろしくお願いしま
す。

LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)
{    
    int i;
    static int sss=0;

    if (nCode < 0)
        return  CallNextHookEx(hMyHook, nCode, wp, lp);
    
    if((lp&0xc0000000)!=0)//キーダウン以外は無視
        return true;
    
    sss=(sss+1)%6;   //*(A) 
    if(sss==1){
    for(i=0;i<4;i++){//*(B)
        keybd_event(wp,0,0,0);        
        keybd_event(wp,0,KEYEVENTF_KEYUP,0);
    }
    return true;
    }
    else{
    return  CallNextHookEx(hMyHook, nCode, wp, lp);
    }    
    return TRUE;
}

ネテロ 2003/12/28(日) 19:07:01
>しかもsssの値(*(A))はキーダウンするごとに1順してしまいます。つまりフックプロシージャ
>が6回呼ばれている?
>さらに2キー同時押しで無限ループに突入してしまいます。
キーを押している時間によっては何度もMyHookProcが呼ばれるからだと思います。

>*(B)のループ回数だけキー入力させるにはどうすればいいのでしょうか?
どういう機能かがわからないと答えられないと思う。
キーを押すといってもいろんな押し方があるし。

key 2003/12/29(月) 00:35:12
>>しかもsssの値(*(A))はキーダウンするごとに1順してしまいます。つまりフックプロシージ>>が6回呼ばれている?
>>さらに2キー同時押しで無限ループに突入してしまいます。
>キーを押している時間によっては何度もMyHookProcが呼ばれるからだと思います。
これはキーリピートがかかる前に離しているので時間によってということはないと思います。

>>*(B)のループ回数だけキー入力させるにはどうすればいいのでしょうか?
>どういう機能かがわからないと答えられないと思う。
>キーを押すといってもいろんな押し方があるし。
これは例えばキーAを3回入力ならばA↓A↑A↓A↑A↓A↑(矢印はkeyUp keyDownの意)
ということです。

LPARAMのログをとると以下のようでした。2段目から下から2段目までがプログラム的に発生さ
せたキーイベントです。
上位2ビットで00がダウン,11がアップ,01がキーリピートです。
00000000001000010000000000000001  キーボード押し下げ
01000000000000000000000000000001
11000000000000000000000000000001
00000000000000000000000000000001
11000000000000000000000000000001
00000000000000000000000000000001
00000000000000000000000000000001
11000000000000000000000000000001
00000000000000000000000000000001
00000000000000000000000000000001
11000000000000000000000000000001
10000000001000010000000000000001  キーボード離す
2つ目の01は00を意図していたのですがキー押し下げ状態でキーダウンイベントを発生させたた
めに01になってしまったというわけです。4文字出力予定が3文字しか出力されなかったのはこ
のためでした。半分解決といったところです。
しかし真ん中あたりの00の次に00がくるのが謎です。プログラム的にはこうならないはずだし
00,00の2回のキーダウンで1文字しか出力されません(これは好都合なのですが)。

dairygoods 2004/01/05(月) 11:36:38
keybd_eventを呼び出した場合にもフックプロシージャに
処理が来るので、その辺を上手く処理する必要があると思います。

古いスレッドには追加発言できません。