2

当用户键入 VB.Net 文本框时,我想检测按键(假设我在写入后无法从文本框中读取文本)。这对英语来说很容易(通过使用 e.KeyChar 或 Keys.[A, B, C, ...etc])。但是,如果我将 Windows 中的默认键盘从英语更改为另一种语言,比如阿拉伯语或波斯语,仍然会检测到英语字符(尽管正在输入阿拉伯语或波斯语)。

4

3 回答 3

2

您可以通过创建一个将 ASCII 键码映射到您在键盘上看到的波斯字符的表来做到这一点。

VB:

'Create a look-up table
Dim Chars(256) As String
Chars(Asc('Q')) = 'ض';
Chars(Asc('W'))= 'ص';
Chars(Asc('E')) = 'ث';
' and so on...

'Now get it
Dim persianChar As String = Chars(e.KeyValue); 'You have your character

C#:

//Create a look-up table
char[] chars = new char[256];
chars['Q'] = 'ض';
chars['W'] = 'ص';
chars['E'] = 'ث';
// and so on...

//Now get it
char persianChar = chars[e.KeyValue]; //You have your character
于 2012-01-22T21:40:25.513 回答
1

如果您使用 KeyDown 而不是 KeyPress 事件,这种事故只能很容易地解释。KeyDown 事件报告虚拟键,它们的名称基于原始 IBM PC 键盘的布局,一种英文布局。该Keys类型在 .NET 框架中声明它们。

然后 Windows 使用选定的键盘布局进一步处理 KeyDown 事件。底层的 winapi 函数是ToUnicodeEx()。它有很多参数,关键参数是 lpKeyState(跟踪修饰键和死键状态)和 dwhkl(选定的键盘布局)。更改机器上的键盘布局会修改最后一个参数。然后触发 KeyPress 事件,如果击键表示键入键,则其 e.KeyCode 参数是 utf-16 Unicode 代码点。

切勿尝试自己解释 KeyDown 事件。您应该覆盖 ProcessCmdKey() 以检测快捷键如 Ctrl+F1。始终使用 KeyPress 事件来键入键。

于 2012-01-22T21:41:42.050 回答
0

键码只是从键盘接收到的信号 - 操作系统将这些信号解释为当前输入语言的任何内容。

如果要测试输入的最后一个字符是否属于特定语言,则需要直接从文本框中测试该字符(检查该值是否在正确的 Unicode 范围内)。

于 2012-01-22T21:30:26.633 回答