2012-01-22 2 views
2

사용자가 VB.Net 텍스트 상자에 입력 할 때 키 입력을 감지하려고합니다 (필기 결과 텍스트 상자에서 텍스트를 읽을 수 없다고 가정). 영어 (e.KeyChar 또는 Keys [A, B, C, ... 등] 사용)는 쉽습니다. 그러나 Windows에서 기본 키보드를 영어에서 다른 언어 (예 : 아랍어 또는 페르시아어)로 변경하면 아랍어 또는 페르시아어를 입력해도 영어 문자가 계속 검색됩니다.VB.net의 비영어권 KeyPress 감지

+0

키 코드가 감지되었습니다. 이들은 OS에 의해 다른 언어로 해석됩니다. – Oded

답변

0

키 코드는 단순히 키보드에서받은 신호입니다. 운영 체제는 현재 입력 언어가 무엇이든이를 해석합니다.

마지막으로 입력 한 문자가 특정 언어에 속하는지 여부를 테스트하려면 입력란에서 문자를 직접 테스트해야합니다 (값이 올바른 유니 코드 범위에 속하는지 확인).

+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 번호 : 당신이에서 KeyDown 대신 KeyPress 이벤트를 사용한 경우 사고의이 종류는 쉽게 설명 될 수

//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 이벤트는 가상 키를보고하며 이름은 원래 IBM PC 키보드의 레이아웃 (영문 레이아웃)을 기반으로합니다. Keys 형식은 .NET Framework에서 해당 형식을 선언합니다.

KeyDown 이벤트는 선택한 키보드 레이아웃을 사용하여 Windows에서 처리됩니다. 기본 winapi 함수는 ToUnicodeEx()입니다. 이것은 많은 인수를 가지며, 중요한 것은 lpKeyState (수정 자 키와 죽은 키 상태를 추적 함)와 dwhkl (선택된 자판 배열)입니다. 머신의 키보드 레이아웃을 변경하면 마지막 인수가 수정됩니다. 키 스트로크가 타이핑 키를 나타내는 경우, KeyPress 이벤트를 전달하는 e.KeyCode 인수는 utf-16 유니 코드 코드 포인트입니다.

직접 KeyDown 이벤트를 해석하지 마십시오. Ctrl + F1과 같은 바로 가기 키 스트로크를 감지하려면 ProcessCmdKey()를 재정의해야합니다. 키를 입력 할 때는 항상 KeyPress 이벤트를 사용하십시오.

+0

설명 주셔서 감사합니다 손,하지만 나는 그것의 대부분이 내 머리 위로 갔다. 나는 당신이 그것을 나의 이해 수준으로 끌어 내릴 필요가 있음을 두려워합니다. 내가 이해 한 것은 ToUnicodEx를 사용하여 키보드 언어를 감지 할 수 있고 따라서 키보드 언어의 문자에 프레스 키를 매핑 할 수 있다는 것입니다. 몇 줄을 써주시겠습니까? – Muhammad

+0

"손"도 내 머리 위로 갔다. KeyPress 이벤트를 사용하십시오. –