在循环中用按键关闭程序
Close program with keypress during a loop
如果按下 F10 键,我想停止程序。此代码键入 a 1000 次。我正在使用 jnativehook 库 (https://github.com/kwhat/jnativehook/wiki/Usage)。
程序运行(使用 F9)但当我按 F10 时它不会停止。
-------------------------------------------- ----------------------------------
package jnativehook01;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
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 SwingExample extends JFrame implements NativeKeyListener, WindowListener {
private static final long serialVersionUID = 1L;
public SwingExample() {
// Set the event dispatcher to a swing safe executor service.
GlobalScreen.setEventDispatcher(new SwingDispatchService());
setTitle("JNativeHook Swing Example");
setSize(300, 150);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
addWindowListener(this);
setVisible(true);
}
public void windowOpened(WindowEvent e) {
// Initialze native hook.
try {
GlobalScreen.registerNativeHook();
}
catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
ex.printStackTrace();
System.exit(1);
}
GlobalScreen.addNativeKeyListener(this);
}
public void windowClosing(WindowEvent e) { /* Unimplemented */ }
public void windowIconified(WindowEvent e) { /* Unimplemented */ }
public void windowDeiconified(WindowEvent e) { /* Unimplemented */ }
public void windowActivated(WindowEvent e) { /* Unimplemented */ }
public void windowDeactivated(WindowEvent e) { /* Unimplemented */ }
// Start program (F9)
public void nativeKeyReleased(NativeKeyEvent e) {
if (e.getKeyCode() == NativeKeyEvent.VC_F9) {
Robot bot;
try {
String text = "a";
StringSelection stringSelection = new StringSelection(text);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, stringSelection);
bot = new Robot();
for (int i = 0; i < 1001; i++) {
//t
bot.keyPress(KeyEvent.VK_T);
bot.delay(100);
bot.keyRelease(KeyEvent.VK_T);
bot.delay(500);
// Type "a"
bot.keyPress(KeyEvent.VK_CONTROL);
bot.keyPress(KeyEvent.VK_V);
bot.keyRelease(KeyEvent.VK_V);
bot.keyRelease(KeyEvent.VK_CONTROL);
bot.delay(500);
//Enter
bot.keyPress(KeyEvent.VK_ENTER);
bot.keyRelease(KeyEvent.VK_ENTER);
if (e.getKeyCode() == NativeKeyEvent.VC_F10) {
System.exit(1);
}
// Wait 4 sec for the new fill
bot.delay(4000);
}
} catch (AWTException e1) {
}
}
}
public void nativeKeyPressed(NativeKeyEvent e) { /* Unimplemented */ }
public void nativeKeyTyped(NativeKeyEvent e) { /* Unimplemented */ }
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new SwingExample();
}
});
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
}
更可能的问题似乎在 if 块内
if (e.getKeyCode() == NativeKeyEvent.VC_F10) {
System.exit(1);
}
System.exit(1) 是在发生某些错误时使用的,因此 System.exit(1) 主要用于 Catch 块。
if (e.getKeyCode() == NativeKeyEvent.VC_F10) {
System.exit(0);return;
}
这应该可以完成工作。
供参考System.exitDetail TerminatingAjavaProgram
这里有几件事。首先,您正在使用 swing,因此您必须访问 AWT 事件调度线程上的 swing 组件。有一个调度程序可以用作此库的一部分。请参阅项目页面上的 working with swing wiki 指南。
现在开始您的实际问题;如何停止循环?我看到你在事件侦听器上有一个循环,它将阻止接收像 F-10 这样的事件,直到循环结束并且线程可以继续分派事件。您应该在其自己的线程中启动 F-9 进程循环,并使用某种线程安全机制在按下 F-10 时向该循环发出信号。如果您出于某种原因想要停止本机挂钩,可以使用 GlobalScreen 上的方法来取消挂钩。
如果按下 F10 键,我想停止程序。此代码键入 a 1000 次。我正在使用 jnativehook 库 (https://github.com/kwhat/jnativehook/wiki/Usage)。
程序运行(使用 F9)但当我按 F10 时它不会停止。
-------------------------------------------- ----------------------------------
package jnativehook01;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
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 SwingExample extends JFrame implements NativeKeyListener, WindowListener {
private static final long serialVersionUID = 1L;
public SwingExample() {
// Set the event dispatcher to a swing safe executor service.
GlobalScreen.setEventDispatcher(new SwingDispatchService());
setTitle("JNativeHook Swing Example");
setSize(300, 150);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
addWindowListener(this);
setVisible(true);
}
public void windowOpened(WindowEvent e) {
// Initialze native hook.
try {
GlobalScreen.registerNativeHook();
}
catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
ex.printStackTrace();
System.exit(1);
}
GlobalScreen.addNativeKeyListener(this);
}
public void windowClosing(WindowEvent e) { /* Unimplemented */ }
public void windowIconified(WindowEvent e) { /* Unimplemented */ }
public void windowDeiconified(WindowEvent e) { /* Unimplemented */ }
public void windowActivated(WindowEvent e) { /* Unimplemented */ }
public void windowDeactivated(WindowEvent e) { /* Unimplemented */ }
// Start program (F9)
public void nativeKeyReleased(NativeKeyEvent e) {
if (e.getKeyCode() == NativeKeyEvent.VC_F9) {
Robot bot;
try {
String text = "a";
StringSelection stringSelection = new StringSelection(text);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, stringSelection);
bot = new Robot();
for (int i = 0; i < 1001; i++) {
//t
bot.keyPress(KeyEvent.VK_T);
bot.delay(100);
bot.keyRelease(KeyEvent.VK_T);
bot.delay(500);
// Type "a"
bot.keyPress(KeyEvent.VK_CONTROL);
bot.keyPress(KeyEvent.VK_V);
bot.keyRelease(KeyEvent.VK_V);
bot.keyRelease(KeyEvent.VK_CONTROL);
bot.delay(500);
//Enter
bot.keyPress(KeyEvent.VK_ENTER);
bot.keyRelease(KeyEvent.VK_ENTER);
if (e.getKeyCode() == NativeKeyEvent.VC_F10) {
System.exit(1);
}
// Wait 4 sec for the new fill
bot.delay(4000);
}
} catch (AWTException e1) {
}
}
}
public void nativeKeyPressed(NativeKeyEvent e) { /* Unimplemented */ }
public void nativeKeyTyped(NativeKeyEvent e) { /* Unimplemented */ }
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new SwingExample();
}
});
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
}
更可能的问题似乎在 if 块内
if (e.getKeyCode() == NativeKeyEvent.VC_F10) {
System.exit(1);
}
System.exit(1) 是在发生某些错误时使用的,因此 System.exit(1) 主要用于 Catch 块。
if (e.getKeyCode() == NativeKeyEvent.VC_F10) {
System.exit(0);return;
}
这应该可以完成工作。 供参考System.exitDetail TerminatingAjavaProgram
这里有几件事。首先,您正在使用 swing,因此您必须访问 AWT 事件调度线程上的 swing 组件。有一个调度程序可以用作此库的一部分。请参阅项目页面上的 working with swing wiki 指南。
现在开始您的实际问题;如何停止循环?我看到你在事件侦听器上有一个循环,它将阻止接收像 F-10 这样的事件,直到循环结束并且线程可以继续分派事件。您应该在其自己的线程中启动 F-9 进程循环,并使用某种线程安全机制在按下 F-10 时向该循环发出信号。如果您出于某种原因想要停止本机挂钩,可以使用 GlobalScreen 上的方法来取消挂钩。