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

时间:2015-01-28 08:24:39

标签: java clipboard hotkeys

我尝试使用Java拦截Copy&Paste Hotkey。 为了全局附加热键,我使用了JKeyMaster,它可以正常工作 在不同的操作系统上附加热键。

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

例如,如果我的剪贴板中有Text:"Test Text"并按 CTRL + V ,则在粘贴发生之前,我想要将剪贴板文本更改为"New Text"

是否有库,我可以使用不覆盖,但只是拦截全局热键?

1 个答案:

答案 0 :(得分:2)

您可以使用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 。我不知道这是否适用于macs,因为我不知道粘贴它们的关键组合。