0

我在为虚拟键盘实现输入法时遇到问题。目前我正在使用机器人类从虚拟键盘向任何应用程序发送输入。但是为此我需要创建 key-code 和 unicode 的映射,这在不同的键盘布局上不一致,我可以直接将 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();
    }
}
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

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

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

根据 Javadoc,Robot 可以发送以 int 形式给出的击键。要从字符创建这些击键,我建议您使用getKeystroke(char)before 创建它们,然后使用getKeycode(). 这样,您将拥有与您的 unicode 字符相关联的整数值,无论它们是什么。

编辑 2:再次修改 ;-)

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

于 2010-03-08T09:28:03.310 回答