JFrame接近背景并听取密钥

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

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

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

  2. ActionListener甚至可以在框架不可见的情况下工作吗?

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

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

在java中,这样的东西只能使用Java Native Interface(简称JNI)。 使用JNI可以编写一个库来挂钩例如c / c ++中的keyevents,并使用java程序调用librarys的方法。

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

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

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

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

问候,Loki

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

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

  1. ActionListener甚至可以在框架不可见的情况下工作吗?

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

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

“多键按压”是什么意思? 如果您的意思是按住某个键时自动重复,则会在自动重复速率的间隔超过自动重复延迟后通过发送多个按键事件来处理。 如果该事件产生可打印字符,您还会收到多个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) { .... } } } }