繁体   English   中英

虚拟键盘的Java输入法

[英]Java input method for Virtual Keyboard

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

我如何抚慰它:

//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);

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

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

根据Javadoc,Robot可以发送给定为int的击键 要创建角色的击键,我会建议您使用创建它们getKeystroke(char)之前将其转换为使用整数getKeycode() 这样,您将使整数值与您的unicode字符相关联,无论它们是哪个。

编辑2 :再次修改;-)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM