2011-07-10 44 views
1

我使用SetWindowHook来设置即时全局热键的低级别keyboark钩子。 但是,当我尝试使用热键代替';'[],/'等字母时,它会返回错误/高价值字母。就像当我按逗号时,它给了我一个1/4的符号。C#热键不正确的字母

这里是回调

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    char letter; 

    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
    { 
     int vkCode = Marshal.ReadInt32(lParam); 

     letter = (char)vkCode; 

     // converts letters to capitals 
     if (char.IsLetter(letter) == true) 
     { 
      if ((((ushort)GetKeyState(0x14)) & 0xffff) != 0) 
      { 
       letter = char.ToUpper(letter); 

       if (GetAsyncKeyState(((int)VirtualKeys.Shift)) != 0) 
       letter = char.ToLower(letter); 
      } 
      else if (GetAsyncKeyState(((int)VirtualKeys.Shift)) != 0) 
      { 
       letter = char.ToUpper(letter); 
      } 
      else 
      { 
       letter = char.ToLower(letter); 
      } 
     } 

     logs.Add(letter); 
    } 

    return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 

我怎样才能标点符号快捷键,而无需手动比较每一个错误的值?

回答

2

第一个问题是,当有一个完美的RegisterHotkey函数时,您正在使用键盘挂钩来获取热键。

然后有一个关键和一个字符是一回事的误解。热键基于虚拟键,请检查Keys枚举以获取C#中的虚拟键值。键和字符之间没有1对1映射。许多键盘布局没有[键。例如德国的键盘[上是的AltGr +

1

你需要阅读scanCode而非vkCodeKBDLLHOOKSTRUCT structure通过lParam指向。

您需要创建相当于KBDLLHOOKSTRUCT的托管struct,然后将您的回调更改为采用结构的ref副本。