全局拦截热键,但保持原始行为
Intercept Hotkey globally, but keep original behaviour
我尝试使用 Java 拦截 Copy&Paste
热键。
为了全局附加热键,我使用了 JKeyMaster,它适用于
在不同的 OS.
上附加热键
不过这一次,我不想在 OS 上附加新的热键。我只想在两者之间执行代码。所以我想在 CTRL+V 上添加一个热键,当我按下它时,在全局范围内,我希望它在或之前执行我的自定义行为在(无关紧要)处理 OS 事件之后。
例如,如果我的剪贴板中有文本:"Test Text"
,然后我按 CTRL+V,在粘贴之前,我想将剪贴板文本更改为 "New Text"
。
有没有一个库,我可以用来不覆盖,而只是截取一个全局热键?
您可以使用 jnativehook. From the 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,因为我不知道要粘贴到它们上的组合键。
我尝试使用 Java 拦截 Copy&Paste
热键。
为了全局附加热键,我使用了 JKeyMaster,它适用于
在不同的 OS.
不过这一次,我不想在 OS 上附加新的热键。我只想在两者之间执行代码。所以我想在 CTRL+V 上添加一个热键,当我按下它时,在全局范围内,我希望它在或之前执行我的自定义行为在(无关紧要)处理 OS 事件之后。
例如,如果我的剪贴板中有文本:"Test Text"
,然后我按 CTRL+V,在粘贴之前,我想将剪贴板文本更改为 "New Text"
。
有没有一个库,我可以用来不覆盖,而只是截取一个全局热键?
您可以使用 jnativehook. From the 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,因为我不知道要粘贴到它们上的组合键。