2010-04-10 77 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並與你的施法將其轉換爲託管關鍵型拉該值。

當然我可能是錯的...