虚拟键盘的Java输入方法

时间:2010-03-08 09:09:35

标签: java awtrobot virtual-keyboard

我在实现虚拟键盘的输入法时遇到了问题。目前我正在使用机器人类从虚拟键盘向任何应用程序发送输入。但是为此我需要创建键码和unicode的映射,这在不同的键盘布局上是不一致的,我可以使用Input方法直接将UNICODE传递给任何应用程序,而无需担心keycode和unicode之间的映射。

任何有用的链接或示例代码都很有用。

这是一个简单的Java程序,它总是在任何应用程序之上,并作为屏幕键盘工作。在按下键盘的任何按钮(键)时使用鼠标,将在下面运行的应用程序中键入相应的字符。这对英文字母非常有效。我在为unicode做的时候遇到了问题。


找到下面的代码段

   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();
    }
}

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您的虚拟键盘是否被操作系统用作设备? 或者,换句话说,您是否尝试将其视为“真正的”键盘? 根据Java硬件抽象,如果您的虚拟键盘被视为驱动程序,它应该像真正的键盘一样工作。

编辑:根据评论,这不是虚拟设备,而是Java应用程序,因此问题不同。

根据Javadoc,机器人可以发送key strokes given as int。要从字符创建这些关键笔划,我建议您先使用getKeystroke(char)创建它们,然后使用getKeycode()将它们转换为整数值。这样,您将使用与您的unicode字符相关联的整数值,无论它们是什么。

编辑2 :再次进行修改; - )

似乎getKeyStroke(String)“应该”处理unicode字符。