C# Keyhook вопрос
Я скопировал следующий код с 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 ответ
Значение lParam.vkCode не является простым типом int, поэтому я не думаю, что вы можете увеличить его таким способом.
если у вас есть ключевой объект, однако...
Keys key = (Keys)lParam.vkCode;
Вы должны иметь возможность делать что-то вроде получения байтового значения и увеличивать его.
int keyVal = Encoding.ASCII.GetByte(key.KeyCode);
keyVal++;
Я думаю, что vkCode - это не фактический код ключа, а, возможно, указатель или что-то еще, присваивая его переменной Key .Net извлекает это значение, и с помощью преобразования приводит его к типу управляемого ключа.
Конечно, я могу ошибаться...