2

次のコードをhttp://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspxからコピーしました。

public int hookProc(int code, int wParam, ref keyboardHookStruct lParam) 
{
    if (code >= 0) 
    {
     Keys key = (Keys)lParam.vkCode;
     if (HookedKeys.Contains(key)) 
        {
         KeyEventArgs kea = new KeyEventArgs(key);
         if((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null)) 
            {KeyDown(this, kea) ;} 
            else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null)) 
            {KeyUp(this, kea); }
            if (kea.Handled)
            {return 1;}
      }
     }
     lParam.vkCode ++;
     lParam.scanCode ++;
     return CallNextHookEx(hhook, code, wParam, ref lParam);
}

正常に動作しますが、少し変更すると次のようになります。

lParam.vkCode ++;
or
lParam.scanCode ++;

CallNextHookEx(...)が返される直前でも、元のキーはメモ帳に表示されたままです。元。「a」を押すと、メモ帳の文字は「b」になると思いますが、それでも「a」です。「lParam」は変わらないようです。理由がわかりませんでしたか?

4

1 に答える 1

1

値 lParam.vkCode は単純な int 型ではないため、この方法で値を増やすことはできないと思います。

ただし、キーオブジェクトを取得したら...

Keys key = (Keys)lParam.vkCode;

バイト値を取得してそれをインクリメントするようなことができるはずです。

int keyVal = Encoding.ASCII.GetByte(key.KeyCode);
keyVal++;

vkCode は実際のキー コードではなく、おそらくポインタか何かだと思います。それを変数 Key .Net に割り当てると、その値が取り込まれ、キャストによってマネージド キー タイプに変換されます。

もちろん、私は間違っている可能性があります...

于 2010-05-19T14:55:41.257 に答える