【问题标题】:C# keyhook questionC# keyhook 问题
【发布时间】:2010-04-10 10:59:10
【问题描述】:

我从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(...) 之前,原来的键仍然出现在记事本中。 前任。如果我按“a”,我希望记事本中的字母是“b”,但它仍然是“a”。 似乎“lParam”没有改变。不明白为什么?

【问题讨论】:

    标签: c# keyhook


    【解决方案1】:

    值 lParam.vkCode 不是简单的 int 类型,所以我认为您不能以这种方式递增它。

    一旦你有了你的关键对象......

    Keys key = (Keys)lParam.vkCode;
    

    你应该能够做一些事情,比如获取字节值并增加它。

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

    我认为 vkCode 不是实际的键代码,而可能是指针或其他东西,通过将其分配给变量 Key .Net 将该值拉入并使用您的转换将其转换为托管键类型。

    当然我可能是错的......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2011-02-20
      相关资源
      最近更新 更多