C#keyhook问题
问题描述:
我从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”不会改变。不明白为什么?
答
值lParam.vkCode不是一个简单的int类型,所以我不认为你可以用这种方式增加它。
一旦你有你的但是关键目标......
Keys key = (Keys)lParam.vkCode;
你应该能够做到像得到字节值,并增加这一点。
int keyVal = Encoding.ASCII.GetByte(key.KeyCode);
keyVal++;
我觉得vkCode是不实际的键码,但也许指针或东西,由它分配给了可变密钥的.Net并与你的施法将其转换为托管关键型拉该值。
当然我可能是错的...