0

仮想キーボードの入力方法の実装で問題に直面しています。現在、仮想キーボードから任意のアプリケーションに入力を送信するためにロボット クラスを使用しています。しかし、そのためには、キーコードとユニコードのマッピングを作成する必要があります。これは、異なるキーボード レイアウトでは一貫していません。キーコードとユニコード間のマッピングを気にせずに、インプット メソッドを使用して UNICODE を任意のアプリケーションに直接渡すことができます。

有用なリンクやサンプル コードは役に立ちます。

これは、常に任意のアプリケーションの上にあり、オンスクリーン キーボードとして機能する単純な Java プログラムです。マウスを使用してキーボードの任意のボタン (キー) を押すと、対応する文字が下で実行されているアプリケーションに入力されます。これは、英語のアルファベットに最適です。ユニコードをやっているときに問題に直面しています。


以下のコードスニペットを見つけてください

   public static void simulateKeyEvent(char key){
    try{
            AWTKeyStroke awtKS = AWTKeyStroke.getAWTKeyStroke(key);
            int key_code = awtKS.getKeyCode();
            System.out.println("key = "+key+" keyCode = "+key_code);
            robot.keyPress(key_code);
            robot.keyRelease(key_code);

    }catch(Exception e){
            e.printStackTrace();
    }
}
4

2 に答える 2

1

どのように解決したか:

//on startup: override the SystemEventQueue
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
final OwnEventQueue newEventQueue = new OwnEventQueue();
eventQueue.push(newEventQueue);
//because dispatchEvent is protected
public class OwnEventQueue {
    private final static OwnEventQueue instance;

    static{
        instance = new OwnEventQueue();
    }

    @Override
    public void dispatchEvent(AWTEvent event) {
        super.dispatchEvent(event);
    }

    public static OwnEventQueue getInstance() {
        return instance;
    }
}
//then onpress of keyboard button
Character character = getCharacter();
int[] events = {KeyEvent.KEY_PRESSED, KeyEvent.KEY_RELEASED, KeyEvent.KEY_TYPED};
for (int i = 0; i < events.length; i++) {
    KeyEvent pressKeyEvent = new KeyEvent(focusComponent, events[i], System.currentTimeMillis(), 0, 0, character.charValue());
    OwnEventQueue.getInstance().dispatchEvent(pressKeyEvent);
}
robotKeystrokeSender.keyPress(KeyEvent.VK_RIGHT);
robotKeystrokeSender.delay(10);
robotKeystrokeSender.keyRelease(KeyEvent.VK_RIGHT);
于 2011-08-11T07:58:36.420 に答える
0

仮想キーボードは OS によってデバイスとして使用されていますか? または、言い換えれば、それを「本物の」キーボードと見なしてみましたか? Java ハードウェアの抽象化によると、仮想キーボードがドライバーと見なされる場合、実際のキーボードのように機能するはずです。

EDIT:コメントによると、これは仮想デバイスではなく、Javaアプリケーションであるため、問題は異なります。

Javadoc によると、ロボットはint として指定されたキーストロークを送信できます。これらのキー ストロークを文字から作成するには、getKeystroke(char)before を使用して作成し、 を使用して整数値に変換することをお勧めしますgetKeycode()。このようにして、Unicode 文字に関連付けられた整数値を持つことになります。

編集2:もう一度、修正;-)

getKeyStroke(String)Unicode 文字を処理する必要があるようです。

于 2010-03-08T09:28:03.310 に答える