C # Keyhook вопрос - PullRequest
       13

C # Keyhook вопрос

2 голосов
/ 10 апреля 2010

Я скопировал следующий код из 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 (...), оригинальные клавиши по-прежнему отображаются в блокноте. Ex. Если я нажму «а», я ожидаю, что буква в блокноте будет «б», но все равно «а». Кажется, что «Ипарам» не меняется. Не мог понять почему?

1 Ответ

1 голос
/ 19 мая 2010

Значение lParam.vkCode не является простым типом типа int, поэтому я не думаю, что вы можете увеличить его таким образом.

как только вы получите ключевой объект ...

Keys key = (Keys)lParam.vkCode;

Вы должны иметь возможность делать что-то вроде получения значения байта и увеличивать его.

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

Я думаю, что vkCode - это не фактический код ключа, а, возможно, указатель или что-то в этом духе, присваивая его переменной Key .Net извлекает это значение и с помощью преобразования приводит к типу управляемого ключа.

Конечно, я могу ошибаться ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...