VB.NET中非英语按键的检测

VB.NET中非英语按键的检测,vb.net,unicode,arabic,persian,Vb.net,Unicode,Arabic,Persian,当用户在VB.Net文本框中键入内容时,我希望检测按键(假设在写入文本框后无法读取文本)。这对于英语来说很容易(通过使用e.KeyChar或Keys[A、B、C等])。但是,如果我将Windows中的默认键盘从英语更改为另一种语言,例如阿拉伯语或波斯语,仍然会检测到英语字符(尽管正在键入阿拉伯语或波斯语)。按键代码只是从键盘接收到的信号-操作系统会将这些信号解释为当前的输入语言 如果要测试输入的最后一个字符是否属于特定语言,则需要直接从文本框中测试该字符(检查该值是否在正确的Unicode范围内

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

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


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

您可以创建一个表,将ASCII键码映射到您在键盘上看到的波斯字符

VB:

C#:


如果您使用的是KeyDown而不是KeyPress事件,那么这种灾难就很容易解释了。KeyDown事件报告虚拟键,它们的名称基于原始IBM PC键盘的布局(英文布局)。
类型在.NET framework中声明它们

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


切勿试图自己解释按键关闭事件。您应该重写ProcessCmdKey()以检测快捷键笔划,如Ctrl+F1。始终使用按键事件键入按键。

检测到按键代码。这些被操作系统解释为一种不同的语言。我曾想过做类似的事情,但问题是我必须映射我正在使用的每种语言。难道没有一种方法可以检测出输入的内容和语言吗?谢谢你的解释,但我担心大部分内容都超出了我的理解范围;恐怕你需要把它降低到我的理解水平。我的理解是,使用ToUnicodEx可以检测键盘语言,从而能够将按键映射到键盘语言中的字符?你能写几行吗?“手”也在我头上。使用按键事件。恐怕我需要知道文本框中字符之前的字符。
'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
//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