Javaの任意のcharからVK intを取得します
-
21-08-2019 - |
質問
文字である char から VK コードを取得するにはどうすればよいですか?次のようなことができるはずのようです javax.swing.KeyStroke.getKeyStroke('c').getKeyCode()
, 、しかしそれは機能しません(結果はゼロです)。KeyEvent をすでに持っている場合はキー コードを取得する方法は誰もが知っていますが、単に char を VK int に変換したい場合はどうすればよいでしょうか?奇妙な文字の FK コードを取得することに興味はありません。[A-Z]、[a-z]、[0-9] のみです。
この問題のコンテキスト--------私が見たすべてのロボットチュートリアルは、プログラマーがVKコードでキープレスを送信することで単語を綴るのが大好きだと仮定しています。
int keyInput[] = { KeyEvent.VK_D, KeyEvent.VK_O, KeyEvent.VK_N, KeyEvent.VK_E };//end keyInput array
怠け者だと言われても仕方がありませんが、たとえ Eclipse であっても、GUI で TDD を使用することはできません。文字列を受け取り、それらの文字列に対するユーザー入力をシミュレートするロボットのようなクラスを知っている人がいれば (私は使用しています) 祭り)、ぜひ知りたいです。
解決
おそらくこの醜いハックは次のとおりです。
Map<String, Integer> keyTextToCode = new HashMap<String, Integer>(256);
Field[] fields = KeyEvent.class.getDeclaredFields();
for (Field field : fields) {
String name = field.getName();
if (name.startsWith("VK_")) {
keyTextToCode.put(name.substring("VK_".length()).toUpperCase(),
field.getInt(null));
}
}
keyTextToCode には文字列からのマッピングが含まれます (例:"A" または "PAGE_UP") を vk コードに変換します。
他のヒント
AWTKeyStroke.getAWTKeyStroke('c').getKeyCode();
若干の説明 ペースの答え. 。二重引用符 (文字列を表す) ではなく、一重引用符 (文字を表す) である必要があります。
二重引用符を使用すると、java.lang.IllegalArgumentException (文字列の形式が正しくありません) がスローされます。
AWTKeyStroke.getAWTKeyStroke("C").getKeyCode();
Robot を拡張するために作成したクラスの大文字と数字に次のコードを使用しています。
public void typeLetterOrNumber(char c) {
if(Character.isLetter(c)) {
keyPress((int)c);
keyRelease((int)c);
}
else if(Character.isDigit(c)) {
keyPress(48+(int)c);
keyRelease(48+(int)c);
}
}
基本的にはただ眺めただけですが、 KeyEvent.VK_何でも 値を計算し、コード内で補正するために適切な計算を行いました。
これに対する簡単な答えはないと思います。
まず、Java には 2 バイトの文字があり、2^16 個近くの KeyEvent.VK_ が定義されていないことに注意してください。したがって、その出力を取得するために KeyEvent を生成できない文字が存在することになります。
また、C と c、Ç と ç はすべて同じです。 KeyEvent.getKeyCode() == KeyEvent.VK_C
.
アダム・ペインターの答え(質問に対する答え) 文字列を KeyEvent に変換する) ここでも機能するはずです。シンプルですが実用的なアイデアは、次のような大きなスイッチを設けることです。
public void type(char character) {
switch (character) {
case 'a': doType(VK_A); break;
case 'b': doType(VK_B); break;
case 'c': doType(VK_C); break;
case 'd': doType(VK_D); break;
case 'e': doType(VK_E); break;
// ...
case 'A': doType(VK_SHIFT, VK_A); break;
case 'B': doType(VK_SHIFT, VK_B); break;
case 'C': doType(VK_SHIFT, VK_C); break;
// ...
}
}
リスト全体(周囲のユーティリティクラスを含む)については、元の回答を参照してください。
文字をできるだけ早く書き出すことが主な目的である場合は、私と同じように文字列をクリップボードに書き込んでから、 Robot
クラスで Ctrl+V を入力します。
static void type(String s) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(s), null);
robot.setAutoDelay(30);
robot.keyPress(VK_CONTROL);
robot.keyPress(VK_V);
robot.keyRelease(VK_CONTROL);
robot.keyRelease(VK_V);
}
システム クリップボードには、必要に応じてクリップボード上のデータを保存および復元できる機能が他にもいくつかあります。また、各文字間の速度を制御したい場合は、各文字を一度に 1 つずつクリップボードに置くことができます。 robot.delay(n);
foreach ループを使用してそれらの間で実行します。
私が見つけた方法は2つあります:
A.JButton.setMnemonic、getMnemonic の回避策を使用します。
javax.swing.JButton but = new javax.swing.JButton();
but.setMnemonic(charVkValue);
int intVkValue = but.getMnemonic());
B.オープン JDK ソースをダウンロードして、その AbstractButton.setMnemonic(char) メソッドを確認してください。このコードは GPL2 の下でライセンスされていますが、これらの 4 行は通常、「keyPress(48+(int)c)」の答えと同じことを行います。