【问题标题】:Using Python to get global keystrokes for java使用 Python 获取 java 的全局击键
【发布时间】: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 内存模型的工作方式)。您始终可以通过某些文件或类似文件进行交流,但这意味着某种轮询...

标签: java python pipe


【解决方案1】:

已经有现有的库可以为您提供此选项(我知道这不是您正在寻找的(python 和其他东西),但它可能是您问题的解决方案)。看看kristian's system hook代码sn-p:

public static void main(String[] args) {
    // might throw a UnsatisfiedLinkError if the native library fails to load or a
    // RuntimeException if hooking fails
    GlobalKeyboardHook keyboardHook = new GlobalKeyboardHook(true); 
    keyboardHook.addKeyListener(new GlobalKeyAdapter() {
        @Override
        public void keyPressed(GlobalKeyEvent event) {
            System.out.println(event);
            if (event.getVirtualKeyCode() == GlobalKeyEvent.VK_ESCAPE)
                run = false;
        }

        @Override
        public void keyReleased(GlobalKeyEvent event) {
            System.out.println(event);
        }
    });

当然还有JNativeHook 选项。


其他一些已经存在的问题可以看看:

How to capture global key presses in java

How can I write a key listener to track all keystrokes in Java?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-11
    • 2019-06-12
    • 1970-01-01
    • 2014-05-06
    • 2012-04-10
    • 2023-03-03
    • 2011-03-21
    • 2011-06-09
    相关资源
    最近更新 更多