web-dev-qa-db-ja.com

SDL物理キーコードとSDL仮想キーコードの違いは何ですか?

構造体SDL_KeysymにはSDL_ScancodeおよびSDL_Keycodeメンバー。それらの違いは何ですか?ドキュメンテーションは私のためにそれを本当に明確にしません。私は両方を試しましたが、彼らは同じことをしているようです。

19
Low-in-Sky

SDLドキュメント を参照してください。スキャンコードはキーの物理的な位置を表し、標準のQWERTYキーボードをモデルにしています。キーコードはキーを押して取得した文字です。

AZERTYキーボードで、 A'Q'スキャンコードと'a'キーコードを発行します。

20
Quentin

一般に、 scancode sはキーボード(ハー​​ドウェア)からOSに出力される真の値であり、キーコードはOS /ライブラリが選択されたレイアウトに基づいてそれにマッピングするものです。レイアウトは、スキャンコードからいくつかの仮想キーコードへのマッピングを決定します。これは、オペレーティングシステムの設定の一部です。ここで、layoutとは、機能的なレイアウトを意味します。機械的および視覚的なレイアウトもあります。ウィキペディアで keyboard layouts の詳細を読んでください。スキャンコードと仮想キーの概念は よりよく説明されています MSDNの図付きです。

ただし、SDLはscancodeを使用して、別の意味を使用します。米国のキーのスキャンコードQWERTYキーボードの位置は問題の場所と同じです。これは、場所に基づいてキーを示す、デバイスに依存しない方法です。これは、異常な場所に埋もれています SDLのマニュアル

スキャンコードはレイアウトに依存しないことを意図しています。これは、これが実際にヨーロッパのキーボードであるかDvorakキーボードであるかに関係なく、「ユーザーが米国のQWERTYキーボードの場合と同じようにQキーを押した」」と考えてください。スキャンコードは常に同じキー位置。

キーコードは、レイアウトに依存することを目的としています。これは、「ユーザーが特定のキーボードで「Q」というラベルの付いたキーを押した」と考えてください。

たとえば、US QWERTYキーボードでCAPSLOCKの右側にある2つのキーを押すと、SDL_SCANCODE_SのスキャンコードとSDLK_Sのキーコードが報告されます。同じキーがDvorakキーボードは、SDL_SCANCODE_SのスキャンコードとSDLK_Oのキーコードを報告します。

上記の引用では、レイアウトとは、マニュアルは機能的なレイアウトを意味します。キーボードに関するマニュアルの main part は、この問題について少し簡潔です:

SDL_Scancode値は、キーボード上のキーボードキーの物理的な場所を表すために使用されます。

SDL_Keycode値は、キーボードの現在のレイアウトにマップされ、SDL_Scancodeに関連付けられます。

どちらを使用するかはアプリケーションに任されています。スキャンコードは、コントロールがレイアウトに依存している状況に適しています(たとえば、左回りの矢印キーとしての「WASD」キー)。一方、キーコードは、コントロールが文字に依存している状況に適しています。 (例:在庫の「I」キー)。

上記の引用では、レイアウトによってマニュアルは機械的/物理的レイアウトを意味します。したがって、たとえば、文字を制御する場合はスキャンコードを使用する方が適切であり、ユーザーの名前を受信する場合はキーコードを使用する方が適切です。

7
legends2k