gpt4 book ai didi

java - 使用 JNativeHook 注册多按键

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:47 31 4
gpt4 key购买 nike

我查看了示例,并尝试在 Google 上搜索了几个小时,但似乎找不到涵盖我所问内容的问题。

如果我想做类似的事情

同时 W + A,并将其注册为单独的键事件,而不仅仅是分别注册为 W 和 A,我将如何使用 JNativeHook 来做到这一点?是因为我错过了某个涵盖此内容的类(class),还是有某种解决方法可以只读取一个键?

我正在尝试在控制台中执行此操作(因此我使用这个库而不是 Swing)。

我拿了他们的例子,想尝试修改一下:

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

public class GlobalKeyListener implements NativeKeyListener {

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

if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
GlobalScreen.unregisterNativeHook();
}
}

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

@Override
public void nativeKeyTyped(NativeKeyEvent e) {
System.out.println("Key Typed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}

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);
}

//Construct the example object and initialze native hook.
GlobalScreen.getInstance().addNativeKeyListener(new GlobalKeyListener());
}
}

最佳答案

您需要监听每个单独的按键按下和释放事件以获得所需的组合,并在每个按键被按下时设置某种标志。如果在按下所需键中的 1 个之后,并且满足标志条件,那么当这些键一起按下时,您可以执行任何需要执行的操作。如果不创建自定义键盘驱动程序,则无法为两个键获取单个事件。如果您的目标是抑制 W 和 A 键事件,直到两者都被按下,请查看 unsupported consuming events文档的一部分。请注意,事件抑制仅在 Windows 和 OS X 目标上可用,并且抑制的事件不会传递给其他应用程序。

这不是最漂亮的例子,但它应该能满足您的需求。

private short hotKeyFlag = 0x00;
private static final short MASK_A = 1 << 0;
private static final short MASK_W = 1 << 1;

...
@Override
public void nativeKeyPressed(NativeKeyEvent e) {
if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
GlobalScreen.unregisterNativeHook();
}
else if (e.getKeyCode() == NativeKeyEvent.VK_A) {
hotKeyFlag &= MASK_A;
}
else if (e.getKeyCode() == NativeKeyEvent.VK_W) {
hotKeyFlag &= MASK_W;
}

// Check the mask and do work.
if (hotKeyFlag == MASK_A & MASK_W) {
// Fire Shortcut.
}
}

@Override
public void nativeKeyReleased(NativeKeyEvent e) {
if (e.getKeyCode() == NativeKeyEvent.VK_A) {
hotKeyFlag ^= MASK_A;
}
else if (e.getKeyCode() == NativeKeyEvent.VK_W) {
hotKeyFlag ^= MASK_W;
}
}

关于java - 使用 JNativeHook 注册多按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26216864/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com