3

Robot クラスを使用して文字列を入力するコードを書いています。ほとんどすべてが適切です (文字キーコードを取得するには、大きな switch ステートメントを使用する必要がありShiftます)。大文字の場合は、 を使用して簡単に確認できCharacter.isUpperCase(c)ますが、 や などの!@#$%^&*()_+さまざまな句読点は「大文字」とは見なされませんが、キーストロークを生成するにはシフトを押す必要があります。グーグルで検索してみましたが、満足のいく回答のないフォーラム投稿を見つけました。文字をシフトする必要があるかどうかを判断する方法はありますか?もしそうなら、どの文字が「シフトされていない」バージョンですか?

編集:これが私がこれまでに持っているコードです。

public void GenerateKeyTyped(char c) {
    if (Character.isUpperCase(c)) {
        r.keyPress(KeyEvent.VK_SHIFT);
    }
    r.keyPress(GetKeyCode(c));
    r.keyRelease(GetKeyCode(c));
    if (Character.isUpperCase(c)) {
        r.keyRelease(KeyEvent.VK_SHIFT);
    }
}
4

4 に答える 4

2

私はあなたの問題を直接解決する方法を知りません(私はそれらのキャラクターにマップを使用することになりました)が、それはあなたにいくつかのアイデアを与えるかもしれません:

import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Main3 {

    public static void main(String[] args) {
        try {
            Robot robot = new Robot();

            HashMap<String, String> map = new HashMap<String, String>();
            map.put("!", "1");
            map.put("@", "2");
            map.put("#", "3");

            char[] charz = "abcdefgABCDEFG123!#".toCharArray();

            for(int i = 0; i < charz.length; i++)
            {
                System.out.print(charz[i] + " : ");
                boolean shiftRequired = false;
                String key = String.valueOf(charz[i]);
                String value = map.get(key);

                if (value != null)
                {
                    shiftRequired = true;
                    key = value;
                }
                else if (Character.isUpperCase(key.charAt(0)))
                {
                    shiftRequired = true;
                }
                else
                {
                    key = key.toUpperCase();
                }

                KeyStroke ks = KeyStroke.getKeyStroke("pressed " + key.toUpperCase());

                int keyCode = ks.getKeyCode();
                System.out.println(keyCode);

                if (shiftRequired)
                    robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT);

                robot.keyPress( keyCode );
                robot.keyRelease( keyCode );

                if (shiftRequired)
                    robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT);
            }


        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}
于 2009-07-09T04:36:17.177 に答える
1

あなたが探しているものが可能かどうかはわかりません。独自のテーブルを作成することもできますが、それは 1 つのキーボード レイアウトでのみ機能することに注意してください (多くの言語には、特定の文字セットにより適した独自のキーボード レイアウトがあります。サポートしたいすべてのキーボード レイアウトを考慮し、それらのカスタム テーブルを作成する場合を除きます。

于 2009-07-09T03:16:26.627 に答える
1

AWT クラスを使用できますか? このようなものがうまくいくかもしれません:

AWTKeyStroke ks = AWTKeyStroke.getAWTKeyStroke('!');
int modifers = ks.getModifiers();

if ((modifiers & KeyEvent.VK_SHIFT) == KeyEvent.VK_SHIFT) {
    // Shift pressed
}
于 2009-07-09T03:19:53.360 に答える
0

ASCII テーブルを見ると、これらの記号キーは次の範囲にあり0x21 - 0x2B
ます。他のすべての記号を認識するために、おそらく ASCII テーブルを見ることができます。

于 2009-07-09T03:11:04.543 に答える