2012-01-22 44 views
2

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

+0

键码被检测到。这些由操作系统解释为不同的语言。 – Oded

回答

0

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

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

+0

恐怕我需要知道它在文本框中的字符。 – Muhammad

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 
+0

我曾经想过做这样的事情,但问题是我必须映射我工作的每种语言。没有办法检测出输入内容和语言的内容吗? – Muhammad

1

这种硬伤只能很容易,如果你使用的KeyDown代替KeyPress事件解释。 KeyDown事件报告虚拟键,它们的名字是根据原IBM PC键盘的布局,英文版的。 Keys类型在.NET框架中声明它们。

然后,Windows使用选定的键盘布局进一步处理KeyDown事件。潜在的winapi功能是ToUnicodeEx()。它有很多参数,关键的是lpKeyState(记录修改键和死键状态)和dwhkl(选定的键盘布局)。更改机器上的键盘布局会修改最后一个参数。然后,它返回KeyPress事件,如果keystroke表示键入键,则它的e.KeyCode参数是utf-16 Unicode代码点。

不要试图自己解释KeyDown事件。您应该重写ProcessCmdKey()以检测快捷键(如Ctrl + F1)。始终使用KeyPress事件来输入密钥。

+0

谢谢你的解释,但是我恐怕大部分都在我的头上;恐怕你需要把它降到我的理解水平。 我的理解是,使用ToUnicodEx可以检测键盘语言,从而能够将按键映射到键盘语言中的字符? 你能写几行吗? – Muhammad

+0

“双手”也过了我的头。使用KeyPress事件。 –