全局拦截热键,但保持原始行为

Posted

技术标签:

【中文标题】全局拦截热键,但保持原始行为【英文标题】:Intercept Hotkey globally, but keep original behaviour 【发布时间】:2015-03-27 01:53:54 【问题描述】:

我尝试使用 Java 拦截到 Copy&Paste 热键。 为了在全局范围内附加热键,我使用了JKeyMaster,它适用于 在不同的操作系统上附加热键。

不过,这一次,我不想在操作系统上附加一个新的热键。我只想在两者之间执行代码。所以我想在 CTRL+V 上添加一个热键,当我按下它时,全局地,我希望它在之前或之后执行我的自定义行为(没关系) 操作系统事件被处理。

例如,如果我的剪贴板中有文本:"Test Text",然后按 CTRL+V,在粘贴发生之前,我想更改剪贴板文本到"New Text"

是否有一个库,我可以使用它来不覆盖,而只是拦截一个全局热键?

【问题讨论】:

docs.oracle.com/javase/7/docs/api/java/awt/datatransfer/… 我知道如何访问剪贴板。问题是我需要知道什么时候。正是在按下 CTRL+V 时或之后。所以我需要在全球范围内连接这个关键事件。但是我发现的所有库都只会覆盖标准行为。这不是我想做的。 code.google.com/p/jnativehook 【参考方案1】:

您可以使用jnativehook。来自keyboard listener example(略有改动):

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

public class GlobalKeyListenerExample implements NativeKeyListener 

    boolean isCtrlDown = false;

    public void nativeKeyPressed(NativeKeyEvent e) 
        System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));

        if (e.getKeyCode() == NativeKeyEvent.VC_CONTROL_L || e.getKeyCode() == NativeKeyEvent.VC_CONTROL_R) 
            System.out.println("Ctrl pressed");
            isCtrlDown = true;
        

        if (e.getKeyCode() == NativeKeyEvent.VC_V && isCtrlDown) 
            System.out.println("User hit Ctrl+V");
        
    

    public void nativeKeyReleased(NativeKeyEvent e) 
        System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));

        if (e.getKeyCode() == NativeKeyEvent.VC_CONTROL_L || e.getKeyCode() == NativeKeyEvent.VC_CONTROL_R) 
            System.out.println("Ctrl released");
            isCtrlDown = false;
        
    

    public void nativeKeyTyped(NativeKeyEvent e) 

    public static void main(String[] args) 
        try 
            GlobalScreen.registerNativeHook();
        
        catch (NativeHookException ex) 
            System.err.println("There was a problem registering the native hook.");
            System.err.println(ex.getMessage());
            System.exit(1);
        

        GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
    

这会有点麻烦,因为如果一个按左右 Ctrl 键,然后释放其中一个而不释放另一个,isCtrlDown 将是false。我不知道这是否适用于 Mac,因为我不知道粘贴到它们上的组合键。

【讨论】:

我无法获得用 ant 构建的 .jar 文件。尽管我将 wiki 用作手册。我可能缺少一些工具。这是做事的巨大开销,为什么不简单地在 github 中提供 .jar 文件呢?无法以这种方式测试您的代码,抱歉。 有版本...好吧。对此进行了测试,它看起来相当不错。我无法将代码实现到我的实际问题,但我能够在粘贴事件实际完成后执行代码 (System.out)。所以这正是我想要的。谢谢

以上是关于全局拦截热键,但保持原始行为的主要内容,如果未能解决你的问题,请参考以下文章

在 Eclipse 中模拟 Netbeans 行为

在保持相同行为的同时隐藏 url 中的 #hash 片段?

面试系列六 之 用户行为数据分析

如何使CSS工具提示在原始项目上严格保持,而不是在新生成的工具提示上?

将记录器消息写入文件和文本区域,同时保持 Java 中的默认行为

在 Eclipse 中编辑 *.ftl 文件时如何获得块注释热键功能?