2010-04-10 3 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 (...) 원래 키는 여전히 메모장에 나타납니다. Ex. "a"를 누르면 메모장의 편지가 "b"이지만 여전히 "a"가 될 것으로 예상됩니다. "lParam"이 변경되지 않는 것 같습니다. 이유를 이해할 수 없습니까?

답변

1

lParam.vkCode 값은 단순한 int 유형이 아니므로이 방식으로 값을 증가시킬 수 있다고 생각하지 않습니다.

당신은 그러나 키 오브젝트 일단 ...

Keys key = (Keys)lParam.vkCode; 

당신은 바이트 값을받을 수 있도록를 증가 뭔가를 할 수 있어야합니다.

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

나는 vkCode 실제 키 코드하지만 어쩌면 변수 키 닷넷에 할당하여 포인터이나 뭐,하지와 캐스트가 관리 키 타입으로 변환하여 그 값을 가져옵니다 생각합니다.

물론 내가 틀릴 수도 ...