java - JAVA中最小化应用程序时如何在后台使用键盘键

标签 java multithreading background keyboard key

我在 JAVA 应用程序中工作,这需要 - 在单独的 txt 文件中获取用户按下的所有键。 - 在应用程序最小化时在后台获取 key 。

我不知道如何做到这一点,目前我正在按照代码工作。

public class KeyChecker1 extends JFrame 
{
    public static JLabel keyLabel = new JLabel("Hit any key");

    public KeyChecker1() 
    {
        super("Hit a Key");
        KeyMonitor1 monitor = new KeyMonitor1(this);
        addKeyListener(monitor);

        setFocusable(true);
        setVisible(true);
    }
    public static void main(String[] arguments) 
    {
        new KeyChecker1();
    }
}
class KeyMonitor1 extends KeyAdapter 
{
    KeyChecker1 display;
    public static Thread t1key, t2;
    KeyMonitor1(KeyChecker1 display) 
    {
        this.display = display;

    }
    public void keyPressed(final KeyEvent event) 
    {

        t1key = new Thread()
        {
             @Override
             public void run()
             {
                try 
                {                                
                    boolean caps_lock = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);
                    switch (event.getKeyCode()) 
                    {
                        case KeyEvent.VK_F1:
                            System.out.print("[F1]");
                            break;
                        case KeyEvent.VK_F2:
                            System.out.print("[F2]");
                            break;
                        case KeyEvent.VK_F3:
                            System.out.print("[F3]");
                            break;
                        case KeyEvent.VK_F4:
                            System.out.print("[F4]");
                            break;
                        case KeyEvent.VK_F5:
                            System.out.print("[F5]");
                            break;
                        case KeyEvent.VK_F6:
                            System.out.print("[F6]");
                            break;
                        case KeyEvent.VK_F7:
                            System.out.print("[F7]");
                            break;
                        case KeyEvent.VK_F8:
                            System.out.print("[F8]");
                            break;
                        case KeyEvent.VK_F9:
                            System.out.print("[F9]");
                            break;
                        case KeyEvent.VK_F10:
                            System.out.print("[F10]");
                            break;
                                 .
                                 .
                                 .
                      }
                }
                catch (Exception ex) 
                {
                    Logger.getLogger(Dashboard.class.getName()).log(Level.SEVERE, null, ex);
                }
             }
          };
          t1key.start();
    }
}

它在应用程序运行时运行良好,但我想在应用程序在后台(最小化)运行时运行相同的功能。

请帮助我。

提前致谢。

最佳答案

要回答这个问题,使用纯 Java 是不可能的。您必须使用特定于操作系统的 API(例如臭名昭​​著的 Windows 上的 SetWindowsHookEx)实现平台相关的键盘和鼠标 Hook ,然后将 native 平台相关数据转换回 Java 可以理解的内容。为了简化这个过程,我创建了 https://github.com/kwhat/jnativehook作为我研究生论文的一部分,因为我需要以可移植的方式为我的本科论文解决这个问题。

关于java - JAVA中最小化应用程序时如何在后台使用键盘键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22293175/

相关文章:

java - 如何获取多个可运行对象共有的变量的最小值?

python - 如何同时运行 2 个列表的循环,以便循环中的每个项目都匹配? [Python]

php - 在 AJAX 中执行带有变量参数的 php 脚本?

java - 我如何才能知道是否有人正在使用 Python 或 Java 积极使用 Linux 计算机?

java - 检测浏览器区域设置/语言并生成输出

java - LWJGL - 生成图 block 后 ArrayList 为空,并且鼠标单击时无法添加四边形

multithreading - SQLite 共享缓存多线程读取

java - 如何将我的新 Spring 框架 Web 应用程序与启用了单点登录 (SSO) 的 Struts 框架 Web 应用程序链接

jquery - 如何在 jQuery 中为背景属性设置动画?

iOS9 : Tiled images from asset catalog are repeating edge pixels (Xcode, objective-c )