JFrame接近背景并听取密钥

时间:2015-07-07 11:03:34

标签: java swing jframe

使用处理新的个人项目。我的目标是将ActionListener中的帧关闭到后台,并且当按下特定键时( Ctrl + Shft + L ),我想要打开框架。

我不知道如何保持低CPU使用率。我知道我可以将帧可见性设置为false,然后可能使用通用的ActionListener作为键,但是我有一些问题(和问题)。

  1. 这是最好的方法吗?我试图尽可能降低CPU使用率。

  2. 当框架不可见时,ActionListener是否会工作?

  3. 如何收听多次按键?我有一个想法,但听起来不会起作用。

2 个答案:

答案 0 :(得分:0)

嗯,问题是java被设计为独立于平台。 要实现这一点,对于用这种编程语言编写的程序必须有一些限制。 即使您的窗口/程序没有设置焦点,您也希望捕获击键。 实际上你需要写的是某种全局的keylistener。 你不能在java中做这些事情。事实上,你必须选择一种更加面向机器的编程语言,比如c / c ++来实现你想要的。

在java中,这样的东西只能使用Java Native Interface(简称JNI)。 使用JNI可以编写一个库,用于挂钩例如c / c ++中的关键事件,并调用图书馆'使用java程序的方法。

JNativeHook(https://github.com/kwhat/jnativehook)正在使用这种方法。但是,我还没有尝试过这个框架,所以我无法判断它是否有效。

但我曾经使用过它,它对我来说很好:http://softk.de/opensource/jglobalkeylistener.html

即使网站是用德语写的,您也可以下载源代码并且不要惊慌,源代码用英语记录,甚至代码中的注释都是英文的。

PS:如果这不起作用,它可以帮助你谷歌搜索类似" java全球键盘记录器",因为这正是键盘记录器正在做的事情(好吧它显然也记录了键)我认为会有更多的东西可以帮助你。

问候,Loki

答案 1 :(得分:0)

  
      
  1. 这是最好的方法吗?我正在努力保持CPU使用率尽可能低。
  2.   

如前所述,使用JNativeHook。它是唯一的跨平台解决方案,它比像while (1) { GetAsyncKeyState(...); Sleep(5); }这样的轮询方法更快,更集中.JNativeHook的最大性能瓶颈是操作系统,而不是库。

  
      
  1. 当框架不可见时,ActionListener是否会工作?
  2.   

除非框架具有焦点,否则它将无法工作,但本机库将提供其他事件,这些事件会失焦,因此您可以通过从NativeInputEvent侦听器制作自己的ActionEvent来使其工作。只需确保将库设置为使用Swing事件调度程序,因为它默认不是!

  
      
  1. 如何收听多次按键?我有一个想法,但听起来不会起作用。
  2.   

“多次按键是什么意思?”如果您的意思是按住某个键时自动重复,则会在自动重复速率的间隔超过自动重复延迟后通过发送多个按键事件来处理。如果该事件产生可打印字符,您还会收到多个Key Typed事件。释放密钥后,将分派单个密钥释放事件。如果您指的是一系列键或多个键,则需要在本机输入侦听器中进行自己的跟踪或检查,但这应该是可能的。

基本修改器示例:请注意,JNativeHook库具有修改键的左右掩码。我假设您想要使用左侧或右侧的组合,这使得这有点复杂。

public void nativeKeyPressed(NativeKeyEvent e) {
    // If the keycode is L
    if (e.getKeyCode() == NativeKeyEvent.VK_L) {
        // We have a shift mask and a control mask for either the left or right key.
        if (e.getModifiers() & NativeInputEvent.SHIFT_MASK && e.getModifiers() & NativeInputEvent.CTRL_MASK) {
            // Make sure you don't have extra modifiers like the meta key.
            if (e.getModifiers() & ~(NativeInputEvent.SHIFT_MASK | NativeInputEvent.CTRL_MASK) == 0x00) {
                ....
            }
        }
    }
}