虚拟键盘的Java输入法

虚拟键盘的Java输入法,java,awtrobot,virtual-keyboard,Java,Awtrobot,Virtual Keyboard,我在实现虚拟键盘的输入法时遇到了一个问题。目前,我正在使用robot类从虚拟键盘向任何应用程序发送输入。但为此,我需要创建键代码和unicode的映射,这在不同的键盘布局上是不一致的,我可以直接使用输入法将unicode传递给任何应用程序,而不必担心键代码和unicode之间的映射 任何有用的链接或示例代码都是有用的 这是一个简单的Java程序,它始终位于任何应用程序之上,并作为屏幕键盘工作。当您按下键盘上的任何按钮(键)时,使用鼠标将在下面运行的应用程序中键入相应的字符。这对英语字母表非常有效

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

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

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

根据Javadoc,机器人可以发送信息。要从字符中创建这些关键笔划,我建议您先使用
创建它们,然后再使用
将它们转换为整数值。这样,您就可以将整数值与unicode字符关联起来,无论它们是什么

编辑2:再次修改;-)

似乎
“应该”处理unicode字符。

我是如何解决的:

//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);
//启动时:覆盖SystemEventQueue
EventQueue EventQueue=Toolkit.getDefaultToolkit().getSystemEventQueue();
最终OwnEventQueue newEventQueue=新OwnEventQueue();
推送(newEventQueue);
//因为dispatchEvent是受保护的
公共类事件队列{
私有最终静态OwnEventQueue实例;
静止的{
实例=新的OwnEventQueue();
}
@凌驾
公共无效调度事件(AWTEvent事件){
超级调度事件(事件);
}
公共静态OwnEventQueue getInstance(){
返回实例;
}
}
//然后按下键盘按钮
Character=getCharacter();
int[]events={KeyEvent.KEY_按下,KeyEvent.KEY_释放,KeyEvent.KEY_键入};
for(int i=0;i
不,它不是用于操作系统的设备。这是一个简单的Java程序,它始终位于任何应用程序之上,并作为屏幕键盘工作。当您按下键盘上的任何按钮(键)时,使用鼠标将在下面运行的应用程序中键入相应的字符。这对英语字母表非常有效。我在使用unicode时遇到了问题。我尝试了您建议的方法,但对unicode字符无效。对于所有UNICODE字符交互测试,它总是返回“0”作为键码,您能举一个用于生成击键和键码的代码示例吗?谢谢!但不适用于Devangri unicode字符我不知道为什么?好吧,这次我必须承认我有点偏离了我的基本技能。但是,您是否在屏幕上显示这些字符?如果是这样,它是否正常工作?你能打印awt.robot使用的钥匙码吗?这些字符可能在unicode表的上限范围内,因此可能被转换为反整数(导致没有笔划)。但要小心:我所说的只是瞎猜。