我在实现虚拟键盘的输入法时遇到了问题。目前我正在使用机器人类从虚拟键盘向任何应用程序发送输入。但是为此我需要创建键码和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();
}
}
答案 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字符。