Обнаружение неанглийского нажатия клавиш в VB.NET - PullRequest
2 голосов
/ 23 января 2012

Когда пользователь вводит текстовое поле VB.Net, я хочу обнаружить нажатие клавиши (при условии, что я не могу прочитать текст из текстового поля после его написания). Это легко для английского языка (используя e.KeyChar или Keys. [A, B, C, ... и т. Д.]). Тем не менее, если я изменю стандартную клавиатуру в Windows с английского на другой язык, например, на арабский или фарси, все равно обнаруживаются английские символы (хотя набирается арабский или фарси).

Ответы [ 3 ]

2 голосов
/ 23 января 2012

Вы можете сделать это, создав таблицу, которая сопоставляет коды клавиш 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 голос
/ 23 января 2012

Этот вид неудачи можно было бы легко объяснить, только если вы использовали KeyDown вместо события KeyPress. Событие KeyDown сообщает о виртуальных клавишах, их имена основаны на раскладке оригинальной клавиатуры IBM PC, английской раскладке. Тип Keys объявляет их в .NET Framework.

Событие KeyDown затем обрабатывается Windows с использованием выбранной раскладки клавиатуры. Основная функция winapi: ToUnicodeEx () . У него много аргументов, ключевые из которых lpKeyState (отслеживает клавиши-модификаторы и состояние мертвой клавиши) и dwhkl (выбранная раскладка клавиатуры). Изменение раскладки клавиатуры на вашем компьютере изменяет последний аргумент. Затем он отключает событие KeyPress, его аргумент e.KeyCode - это кодовая точка Unicode utf-16, если нажатие клавиши представляет печатный ключ.

Никогда не пытайтесь интерпретировать событие KeyDown самостоятельно. Вы должны переопределить ProcessCmdKey (), чтобы обнаружить нажатия клавиш быстрого доступа, такие как Ctrl + F1. Всегда используйте событие KeyPress для набора ключей.

0 голосов
/ 23 января 2012

Коды клавиш - это просто сигналы, полученные с клавиатуры - ОС интерпретирует их на любой текущий язык ввода.

Если вы хотите проверить, относится ли последний введенный символ к определенному языку, вам нужно будет проверить символ непосредственно из текстового поля (убедитесь, что значение находится в правом диапазоне Юникода).

...