0

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

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

39 ''':
40 '(':
41 ')':
42 '*':
44 ',':
45 '-':
46 '.':
47 '/':
58 ':':
59 ';':
63 '?':
64 '@':
91 '[':
92 '\':
93 ']':
95 '_':
123 '{':
125 '}':
161 '¡':
171 '«':
173 '-':
183 '·':
187 '»':
191 '¿':

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

4

1 回答 1

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. 然后,我检测到与我相关的所有键的代码,并将它们与我的主程序过滤器进行 Ored,除了 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
      }

    }
于 2016-06-04T10:43:35.603 回答