代码之家  ›  专栏  ›  技术社区  ›  fini

在循环过程中用按键关闭程序

  •  3
  • fini  · 技术社区  · 7 年前

    如果按了F10键,我想停止程序。此代码键入了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
    
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Ishant_k    7 年前

    更有可能的问题似乎在if块内

    if (e.getKeyCode() == NativeKeyEvent.VC_F10) {
                         System.exit(1);
                    }
    

    if (e.getKeyCode() == NativeKeyEvent.VC_F10) {
                         System.exit(0);return;
                    }
    

    这应该能行。 供参考 System.exitDetail TerminatingAjavaProgram

        2
  •  0
  •   Alex Barker    7 年前

    这里有几件事。首先,您正在使用swing,因此必须在AWT事件调度线程上访问swing组件。有一个调度器可以用作此库的一部分。请参阅项目页面上的使用swing wiki指南。