5

Shift、[、]、Delなどの一部のキーの仮想キーコードは、C ++/Cとは異なる値としてJavaで表示されます。例えば ​​:

Key     Java       C / C++
Shift   16         160
[       91         219
]       93         221
\       92         220
Del     127        46
Window  524        91

これの理由は何ですか?これらのコードは仮想コードですか、それとも別のタイプですか?アルファベット、数字、ファンクションキー(F1〜F12)、バックスペース、`などのキーは同じです。

コンセプトを誤解しているかもしれませんが、その場合は明確にしてください。

C /C++でチェックイン

KBDLLHOOKSTRUCT * kbhook = (KBDLLHOOKSTRUCT *) lParam;
printf("%u\n",kbhook->vkCode);

Javaでチェック

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {                                       
    int code = evt.getKeyCode();
    // code isEqualTo KeyEvent.VK_DELETE : NOTE

}

参照:KeyEventクラス

4

4 に答える 4

3

仮想キーコードは非常に仮想的です。

相互運用しようとしているプラ​​ットフォームごとに、JavaKeyToWin32Key、Win32KeyToJavaなどのコードがないと逃げられません。

これらのキーコードはすべて歴史的なものだと思います。一部はハードウェア設計の決定に由来します(0コードが「A」、1が「S」、2が「D」などのAppleの「最新の」キーコードを見てください。続行するか、「パターン」を取得する必要があります。 "これはキーボードレイアウトから続きますか?)。

「なぜ標準がないのですか?」

それはビジネスであり、個人的なことではありません。34年前は誰もが独自のハードウェアをゼロから開発し、25年前は誰もが最高のCPUを作ろうとしていましたが、15年前はすべてが「プラットフォーム」から始まり、すべてが再び再定義されましたが、既存のソリューションとの互換性を維持します(もちろん、同じ会社による)。

Javaは標準ですが、すべての人に適しているわけではありません。これは、独自のキーコードのセットを持つすべてのOSよりもすでに抽象化されています。したがって、「VK_」はMicrosoftの遺産であり、JavaキーコードはSun Solaris OSの影響を受ける可能性がありますが、よくわかりません。

于 2012-06-01T11:27:46.027 に答える
2

仮想キーコードは、一般的なキーボードにある特定のキーのMS固有の表現です。したがって、仮想修飾子。Javaに指定した値は、 ASCIIエンコーディングを使用する場合のそれらのキーの値を表すことに注意してください。それらは下位ASCIIエンコーディングの一部を形成します。OTOHの場合getchar、ASCIIエンコーディングを使用していれば、Javaと同じ値を取得するなどの標準のC関数を使用しました。ただし、これらの文字に異なる整数が割り当てられる特別な(非ASCII /非Unicodeと考えてください)エンコーディングを使用することもできます。

ASCIIセットは、特に、頻繁に使用される特定の操作(小文字から大文字など)などを最適化できることを念頭に置いて慎重に設計されています。

于 2012-06-01T10:59:43.867 に答える
1

MSDN Libraryは、仮想キーコードの使用について次のように述べています。「キーボードの各キーは、キーを押して離すとスキャンコードを生成します。スキャンコードは、キーを識別するハードウェアに依存する番号です。キーボードドライバーは、各スキャンを変換またはマッピングします。コードから仮想キーコードへ。仮想キーコードは、キーを識別するハードウェアに依存しない番号です。キーボードレイアウトは言語ごとに異なるため、Windows CEは、すべてに見られる仮想キーコードのコアセットのみを提供します。キーボード。このコアセットには、英語の文字、数字、および機能キーや矢印キーなどのいくつかの重要なキーが含まれています

これが仮想キーコードのセットです-これらはKBDLLHOOKSTRUCTvkCodeのメンバーから取得する値です。

于 2012-06-01T11:03:09.083 に答える
0

はい、どちらの場合も仮想コードです。

于 2012-06-01T11:27:03.210 に答える