globalKeyboardHook返回意外的字符C#,VS2013 Win7

时间:2016-06-03 16:11:51

标签: c# event-hooking

我使用globalKeyboardHook来检测某些键盘键。 键盘是标准的英文Microsoft 101键。 对于多种语言,我需要所有字母表(没有数字)和标点符号(句号逗号[] + = _ - ';以及一些类似的。 我不希望包含控制字符。

要过滤我需要的键,我使用char.Isletter || char.isPunctuation。 令我惊讶的是,我发现使用keyboardGlobalHook,char.IsPunctuation 返回标准标点符号(句点,逗号等)。 似乎返回的keyCodes和keyValues与钩子不同。 在没有钩子的简单测试程序中运行相同的char.isPunctuation时,它返回正确的(?)标点符号列表,如下所示:

{'word5': 'word2', 'word7': 'word6', 'word6': 'word5', 'word2': 'word1', 'word3': 'word2', 'word4': 'word3'}

如何使用内置的char.Is ...过滤器仅过滤我需要的键? (我当然可以列出我需要的所有密钥,但为此我需要运行全局钩子并按下每个键以确定返回的代码。)

1 个答案:

答案 0 :(得分:0)

谢谢汉斯。 根据您的回答和我的经验,我意识到虚拟键码与char.Is ...方法不匹配。 因此,我通过简单地与每个密钥相关来解决了这个问题,如下所示: 1.我构建了一个简单的globalKeyBoardHook程序,它在文本框中显示任何键的代码信息:

 public void gkh_KeyDown(object sender, KeyEventArgs e)
    {
  string text = e.KeyValue.ToString() + "," + e.KeyCode.ToString() +","+ (char)(e.KeyValue);
  richTextBox1.AppendText(text + Environment.NewLine);
  File.AppendAllText(@"C:\temp\keys.csv", text + ",\r\n"); //optional log to file
    }

2。然后我检测了与我相关的所有密钥的代码,并将它们添加到我的主程序过滤器,以及char.IsLetterOrDigit,如下所示:

    public int hookProcess(int code, int wParam, ref keyboardHookStruct  lParam) 
    {
     Keys key = (Keys)lParam.vkCode;            
     int keychar = (int)((char)key);

    if (char.IsLetterOrDigit((char)key) || keychar == 32 || keychar == 186
    || keychar == 188 || keychar == 190 || keychar == 191 ||keychar == 219
    || keychar == 220 || keychar == 221 || keychar == 222 || keychar == 226)

      {
       //Do whatever needed or skip if key is irrelevant
      }

    }