当前位置: 首页 > 知识库问答 >
问题:

如何用java在后台运行这个键监听器

戈念
2023-03-14

如何在后台运行这个键监听器?我应该在代码部分嵌入什么?代码在前面的窗口运行良好,但当我切换到另一个窗口时,它失去了它的功能。

import java.util.*;
import javax.imageio.*;
import java.awt.*;
import javax.swing.*; 

public class KeyListenerExample extends Frame implements KeyListener {
    Label l;  
    TextArea area;  

    KeyListenerExample() {
        l=new Label();  
        l.setBounds(20,50,100,20);  
        area=new TextArea();  
        area.setBounds(20,80,300, 300);  
        area.addKeyListener(this);

        add(l);add(area);  
        setSize(400,400);  
        setLayout(null);  
        setVisible(true); 
    }

    public void keyPressed(KeyEvent e) {
        l.setText("Key Pressed");
    }

    public void keyReleased(KeyEvent e) {
        l.setText("Key Released");
    }

    public void keyTyped(KeyEvent e) {
        l.setText("Key Typed");
    }

    public static void main(String[] args) {
        new KeyListenerExample();
    }
}

共有1个答案

司空朝
2023-03-14

您可以使用JNativeHook java库,即使您不在窗口中,该库也可以获取密钥,下面是JNativeHook附带的示例代码。如果它没有清除,请随时提问,您需要下载JNativeHook jar文件

import java.awt.EventQueue;
import java.awt.Toolkit;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.AbstractExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JFrame;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

public class Main2 extends JDialog implements NativeKeyListener {

    private static final long serialVersionUID = 1L;

    public static void main(String[] args) throws Exception {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {

                    Main2 frame = new Main2(new JFrame() {
                        @Override
                        public boolean isShowing() {
                            return true;
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     * 
     * @throws IOException
     */
    public Main2(JFrame jFrame) throws IOException, NativeHookException {
        System.setProperty("sun.java2d.noddraw", "true");
        setBounds(0, 0, 1, 1);

        setUndecorated(true);
        this.setLocationRelativeTo(null);

        try {
            SwingExecutorService ses = new SwingExecutorService();
            GlobalScreen.getInstance().setEventDispatcher(ses);
            GlobalScreen.registerNativeHook();
            Logger loggy = Logger.getLogger(GlobalScreen.class.getPackage().getName());
            loggy.setLevel(Level.SEVERE);
        } catch (Exception e) {

        }

        GlobalScreen.getInstance().addNativeKeyListener(this);

        setFocusable(true);
        setVisible(true);

    }

    @Override
    public void nativeKeyPressed(NativeKeyEvent e) {
        char ch = e.getKeyChar();
        System.out.println(e.getKeyText(e.getKeyCode()));
        int key = e.getKeyCode();
        System.out.println(ch);
        System.out.println(key);
        String modifiers = e.getModifiersText(e.getModifiers());
        int rawCode = e.getRawCode();
        System.out.println(rawCode);
    }

    @Override
    public void nativeKeyTyped(NativeKeyEvent e) {
    }

    private class SwingExecutorService extends AbstractExecutorService {
        private EventQueue queue;

        public SwingExecutorService() {
            queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
        }

        @Override
        public void shutdown() {
            queue = null;
        }

        @Override
        public List<Runnable> shutdownNow() {
            return new ArrayList<>(0);
        }

        @Override
        public boolean isShutdown() {
            return queue == null;
        }

        @Override
        public boolean isTerminated() {
            return queue == null;
        }

        @Override
        public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
            return true;
        }

        @Override
        public void execute(Runnable r) {
            EventQueue.invokeLater(r);
        }
    }

    @Override
    public void nativeKeyReleased(NativeKeyEvent arg0) {
    }
}
 类似资料:
  • 问题内容: 我需要在python终端程序中监听某些按键,而不必使用暂停执行。我已经看到人们使用一些特定于Windows的方式来监听按键,并且我看到人们使用了诸如tkinter和pygame之类的大型模块,这些模块我想避免。 是否有一个轻量级的模块可以跨平台运行(至少是ubuntu,windows,mac)?还是有一种方法可以只使用来自tkinter,pygame等的事件系统? 如果没有,我应该如何

  • 问题内容: Java的switch语句如何在后台运行?它如何将使用的变量的值与案例部分给出的值进行比较?它使用还是,还是完全其他? 我主要对1.7之前的版本感兴趣。 问题答案: 都不行 它使用JVM指令,这实际上是一个表查找。查看以下示例的字节码:

  • 问题内容: 现在,我正在开发类似于bash的命令行应用程序。为了实现自动完成功能,我必须知道用户已经按下Tab键。但是我不知道如何在控制台应用程序中监听键盘事件。 有任何想法吗?提前致谢。 问题答案: 这比看起来要复杂一些。 也许您应该看一下为您处理所有事情的jline项目。

  • 我要研究一下在一天24小时中,哪一个键在哪一个小时打得最多?后来,我会研究在一天24小时中,哪个词在哪个小时使用得最多? null

  • 我试图用我的键控制火箭动画,并尝试使用KeyListener方法,然而,我的程序对我的按键没有反应。我尝试将keylistener添加到我的JFrame,但它没有调用它,因为JFrame是一个单独的静态方法。如果你运行它,你将没有图像,但是,如果你运行,请替换为矩形。你能说出我的错误吗。提前谢了。 下面是我的代码:

  • ap.onAppPause(CALLBACK) 监听应用压后台事件。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <h2 class="am-ft-center">点击 Home 键回到手机桌面</h2> <script