2012-01-22 11 views
2

ユーザーがVB.Netテキストボックスに入力すると、キープレスが検出されます(テキストボックスからテキストを読み込むことができないと仮定して)。これは英語で簡単です(e.KeyCharまたはKeys。[A、B、C、...など]を使用して)。ただし、Windowsのデフォルトキーボードを英語からアラビア語またはペルシア語などの別の言語に変更すると、アラビア語またはペルシア語が入力されているにもかかわらず、英語の文字が検出されます。VB.NETで英語以外のKeyPressを検出する

+0

キーコードが検出されました。これらは、OSによって異なる言語として解釈されます。 – Oded

答えて

0

キーコードは単にキーボードから受信した信号で、OSは現在の入力言語が何であってもこれを解釈します。

最後に入力した文字が特定の言語に属するかどうかをテストする場合は、テキストボックスから文字を直接テストする必要があります(値が正しい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

あなたの代わりにKeyPressイベントのKeyDownイベントを使用した場合に事故のこの種だけで容易に説明できます。 KeyDownイベントは仮想のキーを報告します。その名前は元のIBM PCキーボードのレイアウト、英語のレイアウトに基づいています。 Keysタイプは.NETフレームワークでそれらを宣言します。

さらに、KeyDownイベントは、選択されたキーボードレイアウトを使用してWindowsによって処理されます。基礎となるwinapi関数はToUnicodeEx()です。それには多くの引数があり、重要なのはlpKeyState(修飾キーとデッドキー状態を追跡します)とdwhkl(選択されたキーボードレイアウト)です。マシン上のキーボードレイアウトを変更すると、最後の引数が変更されます。キーストロークがタイピングキーを表す場合、KeyPressイベントをトリガーするe.KeyCode引き数は、utf-16ユニコードコードポイントです。

自分でKeyDownイベントを解釈しようとしないでください。 Ctrl + F1のようなショートカットキーストロークを検出するには、ProcessCmdKey()をオーバーライドする必要があります。常にKeyPressイベントを使用してキーを入力します。

+0

説明のためにありがとう手、しかし私は恐れているそれのほとんどは私の頭の上に行きました;私はそれを私の理解のレベルに引き下げる必要があるのではないかと心配しています。 私が理解したことは、ToUnicodExを使用すると、キーボード言語を検出して、プレスキーをキーボード言語の文字にマップできることです。 何行かお願いしますか? – Muhammad

+0

「手」が私の頭にも行きました。 KeyPressイベントを使用します。 –

関連する問題