環境は 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;
}
>しかもsssの値(*(A))はキーダウンするごとに1順してしまいます。つまりフックプロシージャ
>が6回呼ばれている?
>さらに2キー同時押しで無限ループに突入してしまいます。
キーを押している時間によっては何度もMyHookProcが呼ばれるからだと思います。
>*(B)のループ回数だけキー入力させるにはどうすればいいのでしょうか?
どういう機能かがわからないと答えられないと思う。
キーを押すといってもいろんな押し方があるし。
>>しかも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文字しか出力されません(これは好都合なのですが)。
keybd_eventを呼び出した場合にもフックプロシージャに
処理が来るので、その辺を上手く処理する必要があると思います。