- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个简单的工具来检索当前的鼠标坐标,以帮助我编写 future 的项目。我决定不下载一个,因为我想作为一名自学成才的程序员扩展我的知识。
我将 JNativeHook 用作 NetBeans 中的库,以在 JFrame 未获得焦点时帮助我使用 KeyListeners。我研究和调试了几个小时,发现 KeyReleased 方法不适用于 if 和 switch 语句。它检测到 KeyRelease,因为我将 System.out.println();
放在方法中;它打印出来了。我的代码在下面。
package Main;
import java.awt.MouseInfo;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.util.logging.LogManager;
import javax.swing.*;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.dispatcher.SwingDispatchService;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
public class MainClass implements NativeKeyListener {
static JFrame frame;
static JLabel label;
static JPanel panel;
static boolean run = true; //pause variable
private static void jframe(){ //JFrame code
frame = new JFrame("Mouse Coordinates");
label = new JLabel();
panel = new JPanel();
frame.setUndecorated(true);
frame.setVisible(true);
frame.setResizable(false);
frame.setAlwaysOnTop(true);
panel.add(label);
frame.add(panel);
frame.pack();
}
private static void check(){ //updating label text
if(run){ //if not paused
new Thread(new Runnable() {
@Override
public void run() {
while(run){ //loop
label.setText(MouseInfo.getPointerInfo().getLocation().toString().replaceAll("java.awt.Point", ""));
frame.setSize(label.getWidth() + 5, label.getHeight() + 5); //Adapt frame size to fit label
}
}
}).start();
}
}
public void nativeKeyPressed(NativeKeyEvent e) {
}
public void nativeKeyReleased(NativeKeyEvent e) {
switch(e.getKeyCode()){
case 27: //close code (esc key)
System.exit(0);
case 80: //pause code (p key)
run = !run;
check();
case 67: //copy code (c key)
StringSelection ss = new StringSelection(MouseInfo.getPointerInfo().getLocation().toString().replaceAll("java.awt.Point", "").replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("=", "").replaceAll("x", "").replaceAll("y", "").replaceAll(",", ", ")); //get mouse coordinates and set them as a StringSelection
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); //get the clipboard
cb.setContents(ss, ss); //set what is copied to the current mouse coordinates
break;
}
}
public void nativeKeyTyped(NativeKeyEvent e) {
}
public static void main(String[] args){
LogManager.getLogManager().reset(); //stop the annoying constant logging of GlobalScreen
try {
GlobalScreen.setEventDispatcher(new SwingDispatchService());
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 MainClass());
jframe(); //Run JFrame code
check(); //Run check code
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MainClass();
}
});
}
}
感谢任何帮助重新使用 JNativeHook 的 switch 语句!
最佳答案
这段代码解决了你的问题。
我认为主要问题出在 e.getKeyCode()
上因为它不会在 nativeKeyPressed
上返回相同的值和 nativeKeyReleased
所以我把你的代码放在方法中 public void nativeKeyPressed(NativeKeyEvent e)
我还添加了一些注释以直观地指示您按的是哪个键。
为了避免“魔数(Magic Number)”(27、87、67 谁能猜出是什么意思?)我将其转换为字符串形式,我认为代码的可读性有所提高。
我把 break;
每个 case block 末尾的指令,如果您不放置,代码将遍历所有 case。
public void nativeKeyPressed(NativeKeyEvent e) {
String keyText = NativeKeyEvent.getKeyText(e.getKeyCode());
switch(keyText){
case "Escape": //close code (esc key)
System.out.println("Pressed esc");
System.exit(0);
break;
case "P": //pause code (p key)
System.out.println("Pressed p");
run = !run;
check();
break;
case "C": //copy code (c key)
System.out.println("Pressed c");
StringSelection ss = new StringSelection(MouseInfo.getPointerInfo().getLocation().toString().replaceAll("java.awt.Point", "").replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("=", "").replaceAll("x", "").replaceAll("y", "").replaceAll(",", ", ")); //get mouse coordinates and set them as a StringSelection
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); //get the clipboard
cb.setContents(ss, ss); //set what is copied to the current mouse coordinates
break;
}
}
public void nativeKeyReleased(NativeKeyEvent e) {
}
关于java - JNativeHook (GlobalScreen) 不使用 switch 和 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44596100/
我正在尝试使用 jnativehook对于全局键盘监听器,但似乎键代码不同。例如,我想检查 ALT + I 是否被按下: addNativeKeyListener(new NativeKeyAdapt
我正在使用 JNativeHook 来监听按键操作。当按住按键时,假设计算机应该输入按键 4 次,每个 JNativeHook 方法将注册更多的次数。 我尝试过: public void native
当关键事件被记录时,它会打印到控制台。但不向文本区域添加任何文本。 我这里有一个框架: public class A extends javax.swing.JFrame { public A() {
我尝试使用 java 库 https://github.com/kwhat/jnativehook 将新的 native 按键发布到系统。方法 GlobalScreen.postNativeEvent
我想在输入 ALT+A 时输入:“/ammo”。程序运行但似乎运行后立即停止:我按 alt+A 或 A,代码根本没有执行任何操作。 package jnativehook01; import java
我正在尝试在 Raspberry Pi 平台上使用 JNativeHook 我有一个简单的 java 可执行文件,在 Mac 和 Windows 上运行良好,我认为在基于 Debian 的 linux
感谢您花时间阅读我的问题。 我正在学习 Java,并且正在尝试 JNI。我现在正在做的一件事是尝试制作一个键盘记录器。我可以将击键写入文件等,但它不能捕获密码击键。我的猜测是 JNativehook
所以我需要 jnativehook 来检测何时将复制/粘贴作为复制/粘贴备份应用程序执行,并且由于这是一个控制台应用程序,我不希望它被光标位置和击键发送垃圾邮件,我只需要它安静地坐在那里听复制/粘贴。
我正在尝试构建 jnativehook只是按照维基上的步骤(似乎不完整)但是,当我按照指示运行 ant all 时,我收到此错误: C:\Users\[Username]\Downloads\jnat
在我的程序中希望有一个文本字段,其中包含用户当前按下的键。我可以使用 JNativeHook 来做到这一点,但当前的问题是 JNativeHook 在按下时会记录大量按键。有没有办法忽略按键保持?我想
我正在为 PC 游戏开发一个简单的叠加程序。它只是一个位于屏幕中央的透明矩形,但其大小由用户的鼠标滚轮控制。所以这个概念是简单地将透明矩形的大小与敌方玩家的大小相匹配来计算他的距离。 不幸的是,我无法
我查看了示例,并尝试在 Google 上搜索了几个小时,但似乎找不到涵盖我所问内容的问题。 如果我想做类似的事情 同时 W + A,并将其注册为单独的键事件,而不仅仅是分别注册为 W 和 A,我将如何
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 7 年前。 Improve t
我正在尝试使用 JNativeHook 库为我的 Java 应用程序提供全局键盘和鼠标监听器。我从 here 下载了源文件但我不确定如何将它安装到 eclipse 中并使用它。我也看过 Compili
我正在使用 JNativeHook 检索有关用户活跃程度的信息,但遇到一个问题,我将从单个操作中获得多个响应,但它不一致。它在 1、2 或 3 个响应之间变化,但绝不会超过 3 个,我必须多次运行和退
我正在尝试使用 jnativehooks 更新我的 GUI(例如通过热键更改 jButton 和 jLabel 的文本/颜色),以便当我按下热键时它会更新我的 GUI,但是经过数小时的搜索和尝试,我仍
我一直在尝试从源代码构建jnativehook。我使用的是 Windows 7。我完成了网站上描述的所有阶段。包括更改环境变量目前我从命令提示符处得到构建失败。我已将其粘贴在下面。 我不确定 jnat
我正在制作一个在 Javafx 中具有图形用户界面的翻译程序。我正在使用 JNativeHook 在应用程序未处于焦点时启用全局键监听器。当同时按下 alt 和 t 时,程序应该会从任务栏恢复自身。
我正在创建一个简单的工具来检索当前的鼠标坐标,以帮助我编写 future 的项目。我决定不下载一个,因为我想作为一名自学成才的程序员扩展我的知识。 我将 JNativeHook 用作 NetBeans
我正在查看此网页上的最后一个示例 http://code.google.com/p/jnativehook/wiki/examples (发布在下面) 特别是nativeKeyReleased(Nat
我是一名优秀的程序员,十分优秀!