2010-04-10 74 views
2

我从http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx复制下面的代码,C#keyhook问题

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”不会改变。不明白为什么?

回答

1

值lParam.vkCode不是一个简单的int类型,所以我不认为你可以用这种方式增加它。

一旦你有你的但是关键目标......

Keys key = (Keys)lParam.vkCode; 

你应该能够做到像得到字节值,并增加这一点。

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

我觉得vkCode是不实际的键码,但也许指针或东西,由它分配给了可变密钥的.Net并与你的施法将其转换为托管关键型拉该值。

当然我可能是错的...