【发布时间】:2019-07-11 06:13:32
【问题描述】:
我正在为游戏 HUD GUI 制作一个程序,但是当窗口不在焦点上时,java 无法获得全局击键,所以我不想使用 jnativeinterface 做任何黑魔法,因为我需要它在两个 Linux 上都可以工作和窗户。我解决这个问题的想法是将输出从 python 传输到 java,但我不完全确定如何做到这一点。
这是我目前的代码供参考:
我尝试将 java 键侦听器分配给一个不存在的窗口,只是因为我很好奇,但它不起作用。
package main;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MainThread extends JFrame implements KeyListener{
private static final long serialVersionUID = 1L;
public static void main(String[] args) throws Exception {
System.out.println("Jeffrey was here");
JFrame win = new JFrame();
JPanel wind = new JPanel();
win.add(wind);
win.setDefaultCloseOperation(EXIT_ON_CLOSE);
win.setVisible(true);
win.setLocation(500, 500);
win.setResizable(false);
win.setSize(300,50);
win.setAlwaysOnTop(true);
win.setTitle("Mouse Cordinates");
JLabel xCord = new JLabel("");
JLabel yCord = new JLabel("");
wind.add(xCord);
wind.add(yCord);
while(true) {
Thread.sleep(30);
PointerInfo mouse = MouseInfo.getPointerInfo();
Point poin = mouse.getLocation();
xCord.setText("X cordinates: " + (int) poin.getX());
yCord.setText("Y cordinates: " + (int) poin.getY());
}
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
int key = arg0.getKeyCode();
if(key == KeyEvent.VK_W) {
System.out.print("w pressed");
}
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
我需要它来检测何时在窗口未聚焦的情况下按下了键。
【问题讨论】:
-
你的python代码在哪里?您的 python 脚本何时以及如何启动?两个进程(Java 和 Python)如何通信?
-
我还没有写任何python,问题更多的是,有没有更好的方法或者python管道会导致问题
-
“管道”是什么意思?我对管道的理解是某些 shell 中的
|,这意味着某种命令行参数,但我想您的 java 应用程序已经在运行。这就是为什么我问这些进程是如何通信的。据我所知,不可能在 python 中写入一些内存,然后再从 Java 访问该内存(这不是 JVM 内存模型的工作方式)。您始终可以通过某些文件或类似文件进行交流,但这意味着某种轮询...