【问题标题】:globalKeyboardHook returns unexpected chars C#, VS2013 Win7globalKeyboardHook 返回意外字符 C#,VS2013 Win7
【发布时间】:2016-06-03 16:11:50
【问题描述】:

我使用 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... 过滤器仅过滤我需要的键? (我自然可以列出我需要的所有键,但为此我需要运行全局挂钩并按下每个键以确定返回的代码)。

【问题讨论】:

  • 这样的键盘挂钩会产生虚拟键码。它们在世界任何地方都是一样的。它们产生的字符不是,它们取决于用户选择的键盘布局和键盘状态,例如 Shift/Ctrl/Alt 键是否按下以及之前是否按下了 AltGr 等任何死键。这些属性是每个进程的,因此通常不可能使用全局挂钩可靠地做到这一点。你需要一个 WH_KEYBOARD 钩子,因为你不能用 C# 编写一个钩子,所以很难开始。

标签: c# event-hooking


【解决方案1】:

谢谢汉斯。 根据您的回答和我的经验,我意识到虚拟键码与 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
      }

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-06
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多