2011-01-27 11 views
6

ユーザのキーボードのように見えるようにカスタマイズするキーボードレイアウトを生成する必要がある場合、どうすればよいですか?例えば使用しているキーボードと同じキーボードレイアウトを作成できますか?

このような何か:

enter image description here

フランス語、スウェーデン語、英語、カナダなどは右、異なるレイアウトを持つことになります。これはたくさんの作業か、.NETの地域クラスで構築された何らかの種類のものを使用することの問題ですか?

+4

書く人のためのすてきなアドオンのように見えます;) – Oded

+0

Googleイメージを使用するだけで、国際的なキーボードレイアウトの写真を手に入れることができます。たとえば、[フランス語のキーボードレイアウト](http://www.google.com/images?hl=ja&q=french+keyboard+layout)にgooglingしてみてください。 – Timwi

+0

はい、私はあらかじめ定義されたスタイルで最初から描画する必要があります。また、私はレイアウトを使用する場合、私はすべての画像を格納する必要がありますよね?実行時に動的に(カスタマイズダイアログが起動されたとき)これを行う必要があります。 –

答えて

8

キーを押すと、Windowsオペレーティングシステムに「スキャンコード」を報告するハードウェアイベントが生成されます。このスキャンコードは、(キャップ状態、シフト/Altキー/Ctrlキー KEYSTATE、また、保留中の死者のキーをロックし、他のキーボードの状態の要因と一緒にスキャンコードに基づいて「仮想キーコード」に変換され、ストローク)。変換されたVK値は、KeyDownイベントによって報告された値です。

スキャンコードからVKコードへの変換は現在の入力ロケールに依存します。入力ロケールはスキャンコードと仮想キーコード間のマッピングを簡素化します。キーボード入力の詳細については、the MSDN documentationを参照してください。

このルックアッププロセスを逆にすると、各仮想キーコードに対応するスキャンコードを特定することができます(シフト/ Ctrl/Altステートのために同じスキャンコードが複数のVKコードにマッピングされます)。 Win32 APIは、MAPVK_VK_TO_VSC_EXオプションを使用して、このマッピングを実行するための関数MapVirtualKeyExを提供します。これを使用して、特定のVKコードを生成するスキャンコードを特定できます。

残念ながら、これはプログラムで行える限りです。つまり、スキャンコードごとにキーボードの物理レイアウトやキーの位置を判断する方法はありません。ただし、ほとんどの物理キーボードは同じ方法で配線されているため、ほとんどの物理的なキーボードデザインでは、左上のキーのスキャンコードは同じになります。基本的な物理的キーボードレイアウト(101キー、102キーなど)に応じて、この想定されている規則を使用して、スキャンコードに対応する物理的な場所を推測することができます。それは保証されていませんが、かなり安全です。

次のコードは、私が書いた大規模なキーボード処理ライブラリの抜粋です(私はオープンソースにしようとしていましたが、時間はありませんでした)。このメソッドは、与えられた入力ロケール(this._inputLanguageに格納され、System.Windows.Forms.InputLanguageとして宣言されている)に対してVKコードでインデックスされた配列(this._virtualKeyScanCodes)を初期化します。この配列を使用して、VKコードに対応するスキャンコードを確認できます。例えば、this._virtualKeyScanCodes[VK_NUMPAD0] - スキャンコードがゼロの場合、現在の入力ロケールのキーボードではそのVKを使用できません。ゼロ以外の場合は、物理キーを推測できるスキャンコードです。

残念なことに、デッドキー(アクセント付きの文字を生成する複数のキーの組み合わせなど)の領域に入ると、問題はこれよりやや複雑になります。それは今のところ複雑すぎるのですが、マイケル・S・カップランは詳細なシリーズをblog postsと書いています。がんばろう!

編集:あなたも同様のthis questionも参照してください。

+2

+1私の答えのコメントで議論していたものよりも良いです:) – GWLlosa

2

キーボードレイアウトを含む組み込みの.NETクラスはありません。キーボードレイアウトはオペレーティングシステム(通常はWindows)の機能です。 .NETが関与するまでに、押されたキーはハードウェアイベントからソフトウェアイベントに変換されました。これを実際に見たい場合は、キーが2つのキーボードレイアウトの間で移動する2つのキーボードレイアウトを見つけてください。 Key_Downイベントでイベントハンドラを持つダミーアプリケーションをセットアップし、イベント引数が同一であることに注意してください。 -キーを押した場合、-キーがどこにあるかにかかわらず、-キーを押したとします。

+0

ありがとうございます。しかし、ロシア語、中国語のキーボードではどうやってこれをやっていますか? Keys.Aなどを返すキーのように。また、画面上で使用しているキーボードのレイアウトを再現できるアプリもあります。 WindowsのOSDキーボードはそれをしますか? –

+0

WindowsのOSDを使用している可能性があります。これはオペレーティングシステムのユーティリティであるため、実際はレイアウトを認識しています。 http://www.microsoft.com/windowsxp/using/accessibility/osklayout.mspxを参照してください。 – GWLlosa

+0

ありがとうございますが、どのように使用できますか?それはそれがAPIにフックするように見えるのではないような別のアプリですか? –

関連する問題