我正在为Windows和macOS开发一个屏幕键盘,我做了一个小测试应用程序。它只有一个按钮,并在活动应用程序中键入字母“M”。它适用于Windows 10,但不适用于Mac(我正在运行macOS 10.12)。在macOS中,只要我按下按钮,我试图发送“M”的任何应用程序都会失去焦点(文本输入的光标消失),即使我的单键“键盘”已经设置了setFocusable(false)这个地方。我也在按钮上尝试了自己的MouseListener。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class main {
private static Robot robot;
private static Rectangle rectangle;
public static void main(String[] args){
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
Button button = new Button("M");
button.setFocusable(false);
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(100, 100);
frame.add(button);
frame.setAlwaysOnTop(true);
//set everything I can think of to unfocusable!!!
frame.setFocusable(false);
frame.setAutoRequestFocus(false);
frame.setFocusableWindowState(false);
frame.getRootPane().setFocusable(false);
frame.setVisible(true);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendKeystroke();
}
});
//Instead of adding a listener to the button, I've also tried my own MouseListener.
/* button.addMouseListener(new MouseTrap());
rectangle = button.getBounds();*/
}
private static void sendKeystroke(){
robot.keyPress(KeyEvent.VK_M);
robot.keyRelease(KeyEvent.VK_M);
}
private static class MouseTrap extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent e) {
if (rectangle.contains(e.getPoint())){
sendKeystroke();
}
}
}
}
似乎macOS确实让一些应用程序具有焦点而无需从另一个应用程序获取光标。例如VMware或聚光灯从系统托盘中搜索。
Cursor for VMware and IntelliJ at the same time
我见过其他非Java的答案:
Virtual Keyboard Cocoa & Objective C
但是当Java在Windows上运行时,我真的必须全部使用本机吗?除了学习曲线(没有在Mac上做任何原生),我想尽可能保持Win和Mac版本的版本。
任何人都知道如何使用直接Java来实现这一点?
(注意:与上述链接的提问者一样,我不能只使用键盘视图,因为我想从键盘发送修改/附加数据,例如文本预测。我认为这需要额外的本机代码再次。)
答案 0 :(得分:0)
我试图找到方法。但似乎纯Java没有任何本机代码是不可能的。