在VB.NET中检测非英语KeyPress

时间:2012-01-22 21:13:22

标签: vb.net unicode arabic persian

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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事件键入键。

答案 2 :(得分:0)

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

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