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



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

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

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只过滤我需要的密钥。是…过滤器吗?(我可以自然地列出我需要的所有键,但为此,我需要运行全局钩子并按下每个键来确定返回的代码)。

谢谢汉斯。根据你的回答和我的经验,我意识到虚拟密钥代码与字符不匹配。是…方法。因此,我简单地将每个关键点联系起来,解决了这个问题,如下所示: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:tempkeys.csv", text + ",rn"); //optional log to file
}

2.然后,我检测到所有与我相关的键的代码,并将它们添加到我的主程序过滤器中,此外还有字符。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
}
}

相关内容

  • 没有找到相关文章

最新更新