Использование Python для получения глобальных нажатий клавиш для Java - PullRequest
0 голосов
/ 17 февраля 2019

Я делаю программу для игрового 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

    }
}

Мне нужно, чтобы он обнаруживал, когда клавиша нажата, когда окно не в фокусе.

1 Ответ

0 голосов
/ 17 февраля 2019

Уже существуют библиотеки, которые предоставляют вам эту опцию (я знаю, что это не совсем то, что вы ищете (python и прочее), но это может быть решением вашей проблемы) .Взгляните на системный хук Кристиана фрагмент кода:

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 .


Некоторые другие уже существующие вопросы, на которые стоит взглянуть:

Как перехватить нажатие клавиш в Java

Как написать слушатель клавиш для отслеживания всех нажатий клавишна Яве?

...