!7 lib 1010545 // JNativeHook /* JNativeHook: Global keyboard and mouse hooking for Java. * Copyright (C) 2006-2016 Alexander Barker. All Rights Received. * https://github.com/kwhat/jnativehook/ * * JNativeHook is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JNativeHook is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ // Imports. import org.jnativehook.GlobalScreen; import org.jnativehook.NativeHookException; import org.jnativehook.NativeInputEvent; import org.jnativehook.dispatcher.SwingDispatchService; import org.jnativehook.keyboard.NativeKeyEvent; import org.jnativehook.keyboard.NativeKeyListener; import org.jnativehook.mouse.NativeMouseEvent; import org.jnativehook.mouse.NativeMouseInputListener; import org.jnativehook.mouse.NativeMouseWheelEvent; import org.jnativehook.mouse.NativeMouseWheelListener; import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import javax.swing.text.BadLocationException; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.ItemSelectable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Date; import java.util.logging.ConsoleHandler; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; p { NativeHookDemo.main(args); } /** * A demonstration of how to use the JNativeHook library. * * @author Alexander Barker (alex@1stleg.com) * @version 2.0 * @since 1.0 * * @see GlobalScreen * @see NativeKeyListener */ public sclass NativeHookDemo extends JFrame implements ActionListener, ItemListener, NativeKeyListener, NativeMouseInputListener, NativeMouseWheelListener, WindowListener { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1541183202160543102L; /** Menu Items */ private JMenu menuSubListeners; private JMenuItem menuItemQuit, menuItemClear; private JCheckBoxMenuItem menuItemEnable, menuItemKeyboardEvents, menuItemButtonEvents, menuItemMotionEvents, menuItemWheelEvents; /** The text area to display event info. */ private JTextArea txtEventInfo; /** Logging */ private static final Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName()); /** * Instantiates a new native hook demo. */ public NativeHookDemo() { // Setup the main window. setTitle("JNativeHook Demo"); setLayout(new BorderLayout()); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); setSize(600, 300); addWindowListener(this); JMenuBar menuBar = new JMenuBar(); // Create the file menu. JMenu menuFile = new JMenu("File"); menuFile.setMnemonic(KeyEvent.VK_F); menuBar.add(menuFile); menuItemQuit = new JMenuItem("Quit", KeyEvent.VK_Q); menuItemQuit.addActionListener(this); menuItemQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, ActionEvent.ALT_MASK)); menuItemQuit.getAccessibleContext().setAccessibleDescription("Exit the program"); menuFile.add(menuItemQuit); // Create the view. JMenu menuView = new JMenu("View"); menuView.setMnemonic(KeyEvent.VK_V); menuBar.add(menuView); menuItemClear = new JMenuItem("Clear", KeyEvent.VK_C); menuItemClear.addActionListener(this); menuItemClear.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK)); menuItemClear.getAccessibleContext().setAccessibleDescription("Clear the screen"); menuView.add(menuItemClear); menuView.addSeparator(); menuItemEnable = new JCheckBoxMenuItem("Enable Native Hook"); menuItemEnable.addItemListener(this); menuItemEnable.setMnemonic(KeyEvent.VK_H); menuItemEnable.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK)); menuView.add(menuItemEnable); // Create the listeners sub menu. menuSubListeners = new JMenu("Listeners"); menuSubListeners.setMnemonic(KeyEvent.VK_L); menuView.add(menuSubListeners); menuItemKeyboardEvents = new JCheckBoxMenuItem("Keyboard Events"); menuItemKeyboardEvents.addItemListener(this); menuItemKeyboardEvents.setMnemonic(KeyEvent.VK_K); menuItemKeyboardEvents.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_K, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK)); menuSubListeners.add(menuItemKeyboardEvents); menuItemButtonEvents = new JCheckBoxMenuItem("Button Events"); menuItemButtonEvents.addItemListener(this); menuItemButtonEvents.setMnemonic(KeyEvent.VK_B); menuItemButtonEvents.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK)); menuSubListeners.add(menuItemButtonEvents); menuItemMotionEvents = new JCheckBoxMenuItem("Motion Events"); menuItemMotionEvents.addItemListener(this); menuItemMotionEvents.setMnemonic(KeyEvent.VK_M); menuItemMotionEvents.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK)); menuSubListeners.add(menuItemMotionEvents); menuItemWheelEvents = new JCheckBoxMenuItem("Wheel Events"); menuItemWheelEvents.addItemListener(this); menuItemWheelEvents.setMnemonic(KeyEvent.VK_W); menuItemWheelEvents.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK)); menuSubListeners.add(menuItemWheelEvents); setJMenuBar(menuBar); // Create feedback area. txtEventInfo = new JTextArea(); txtEventInfo.setEditable(false); txtEventInfo.setBackground(new Color(0xFF, 0xFF, 0xFF)); txtEventInfo.setForeground(new Color(0x00, 0x00, 0x00)); txtEventInfo.setText(""); JScrollPane scrollPane = new JScrollPane(txtEventInfo); scrollPane.setPreferredSize(new Dimension(375, 125)); add(scrollPane, BorderLayout.CENTER); // Disable parent logger and set the desired level. logger.setUseParentHandlers(false); logger.setLevel(Level.ALL); // Add our custom formatter to a console handler. ConsoleHandler handler = new ConsoleHandler(); handler.setFormatter(new LogFormatter()); handler.setLevel(Level.WARNING); logger.addHandler(handler); /* Note: JNativeHook does *NOT* operate on the event dispatching thread. * Because Swing components must be accessed on the event dispatching * thread, you *MUST* wrap access to Swing components using the * SwingUtilities.invokeLater() or EventQueue.invokeLater() methods. */ GlobalScreen.setEventDispatcher(new SwingDispatchService()); setVisible(true); } /** * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(ActionEvent e) { if (e.getSource() == menuItemQuit) { this.dispose(); } else if (e.getSource() == menuItemClear) { txtEventInfo.setText(""); } } /** * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent) */ public void itemStateChanged(ItemEvent e) { ItemSelectable item = e.getItemSelectable(); if (item == menuItemEnable) { try { // Keyboard checkbox was changed, adjust listeners accordingly. if (e.getStateChange() == ItemEvent.SELECTED) { // Initialize native hook. This is done on window open because the // listener requires the txtEventInfo object to be constructed. GlobalScreen.registerNativeHook(); } else { GlobalScreen.unregisterNativeHook(); } } catch (NativeHookException ex) { txtEventInfo.append("Error: " + ex.getMessage() + "\n"); } // Set the enable menu item to the state of the hook. menuItemEnable.setState(GlobalScreen.isNativeHookRegistered()); // Set enable/disable the sub-menus based on the enable menu item's state. menuSubListeners.setEnabled(menuItemEnable.getState()); } else if (item == menuItemKeyboardEvents) { // Keyboard checkbox was changed, adjust listeners accordingly if (e.getStateChange() == ItemEvent.SELECTED) { GlobalScreen.addNativeKeyListener(this); } else { GlobalScreen.removeNativeKeyListener(this); } } else if (item == menuItemButtonEvents) { // Button checkbox was changed, adjust listeners accordingly if (e.getStateChange() == ItemEvent.SELECTED) { GlobalScreen.addNativeMouseListener(this); } else { GlobalScreen.removeNativeMouseListener(this); } } else if (item == menuItemMotionEvents) { // Motion checkbox was changed, adjust listeners accordingly if (e.getStateChange() == ItemEvent.SELECTED) { GlobalScreen.addNativeMouseMotionListener(this); } else { GlobalScreen.removeNativeMouseMotionListener(this); } } else if (item == menuItemWheelEvents) { // Motion checkbox was changed, adjust listeners accordingly if (e.getStateChange() == ItemEvent.SELECTED) { GlobalScreen.addNativeMouseWheelListener(this); } else { GlobalScreen.removeNativeMouseWheelListener(this); } } } /** * @see org.jnativehook.keyboard.NativeKeyListener#nativeKeyPressed(org.jnativehook.keyboard.NativeKeyEvent) */ public void nativeKeyPressed(NativeKeyEvent e) { displayEventInfo(e); } /** * @see org.jnativehook.keyboard.NativeKeyListener#nativeKeyReleased(org.jnativehook.keyboard.NativeKeyEvent) */ public void nativeKeyReleased(NativeKeyEvent e) { displayEventInfo(e); } /** * @see org.jnativehook.keyboard.NativeKeyListener#nativeKeyTyped(org.jnativehook.keyboard.NativeKeyEvent) */ public void nativeKeyTyped(NativeKeyEvent e) { displayEventInfo(e); } /** * @see org.jnativehook.mouse.NativeMouseListener#nativeMouseClicked(org.jnativehook.mouse.NativeMouseEvent) */ public void nativeMouseClicked(NativeMouseEvent e) { displayEventInfo(e); } /** * @see org.jnativehook.mouse.NativeMouseListener#nativeMousePressed(org.jnativehook.mouse.NativeMouseEvent) */ public void nativeMousePressed(NativeMouseEvent e) { displayEventInfo(e); } /** * @see org.jnativehook.mouse.NativeMouseListener#nativeMouseReleased(org.jnativehook.mouse.NativeMouseEvent) */ public void nativeMouseReleased(NativeMouseEvent e) { displayEventInfo(e); } /** * @see org.jnativehook.mouse.NativeMouseMotionListener#nativeMouseMoved(org.jnativehook.mouse.NativeMouseEvent) */ public void nativeMouseMoved(NativeMouseEvent e) { displayEventInfo(e); } /** * @see org.jnativehook.mouse.NativeMouseMotionListener#nativeMouseDragged(org.jnativehook.mouse.NativeMouseEvent) */ public void nativeMouseDragged(NativeMouseEvent e) { displayEventInfo(e); } /** * @see org.jnativehook.mouse.NativeMouseWheelListener#nativeMouseWheelMoved(org.jnativehook.mouse.NativeMouseWheelEvent) */ public void nativeMouseWheelMoved(NativeMouseWheelEvent e) { displayEventInfo(e); } /** * Write information about the NativeInputEvent to the text * window. * * @param e the native input event to display. */ private void displayEventInfo(final NativeInputEvent e) { txtEventInfo.append("\n" + e.paramString()); try { //Clean up the history to reduce memory consumption. if (txtEventInfo.getLineCount() > 100) { txtEventInfo.replaceRange("", 0, txtEventInfo.getLineEndOffset(txtEventInfo.getLineCount() - 1 - 100)); } txtEventInfo.setCaretPosition(txtEventInfo.getLineStartOffset(txtEventInfo.getLineCount() - 1)); } catch (BadLocationException ex) { txtEventInfo.setCaretPosition(txtEventInfo.getDocument().getLength()); } } /** * Unimplemented * * @see java.awt.event.WindowListener#windowActivated(java.awt.event.WindowEvent) */ public void windowActivated(WindowEvent e) { /* Do Nothing */ } /** * Unimplemented * * @see java.awt.event.WindowListener#windowClosing(java.awt.event.WindowEvent) */ public void windowClosing(WindowEvent e) { /* Do Nothing */ } /** * Unimplemented * * @see java.awt.event.WindowListener#windowDeactivated(java.awt.event.WindowEvent) */ public void windowDeactivated(WindowEvent e) { /* Do Nothing */ } /** * Unimplemented * * @see java.awt.event.WindowListener#windowDeiconified(java.awt.event.WindowEvent) */ public void windowDeiconified(WindowEvent e) { /* Do Nothing */ } /** * Unimplemented * * @see java.awt.event.WindowListener#windowIconified(java.awt.event.WindowEvent) */ public void windowIconified(WindowEvent e) { /* Do Nothing */ } /** * Display information about the native keyboard and mouse along with any * errors that may have occurred. * * @see java.awt.event.WindowListener#windowOpened(java.awt.event.WindowEvent) */ public void windowOpened(WindowEvent e) { // Return the focus to the window. this.requestFocusInWindow(); // Enable the hook, this will cause the GlobalScreen to be initilized. menuItemEnable.setSelected(true); // Please note that these properties are not available until after the GlobalScreen class is initialized. txtEventInfo.append("JNativeHook Version " + System.getProperty("jnativehook.lib.version")); txtEventInfo.append("\nAuto Repeat Rate: " + System.getProperty("jnativehook.key.repeat.rate")); txtEventInfo.append("\n" + "Auto Repeat Delay: " + System.getProperty("jnativehook.key.repeat.delay")); txtEventInfo.append("\n" + "Double Click Time: " + System.getProperty("jnativehook.button.multiclick.iterval")); txtEventInfo.append("\n" + "Pointer Sensitivity: " + System.getProperty("jnativehook.pointer.sensitivity")); txtEventInfo.append("\n" + "Pointer Acceleration Multiplier: " + System.getProperty("jnativehook.pointer.acceleration.multiplier")); txtEventInfo.append("\n" + "Pointer Acceleration Threshold: " + System.getProperty("jnativehook.pointer.acceleration.threshold")); try { txtEventInfo.setCaretPosition(txtEventInfo.getLineStartOffset(txtEventInfo.getLineCount() - 1)); } catch (BadLocationException ex) { txtEventInfo.setCaretPosition(txtEventInfo.getDocument().getLength()); } // Enable all of the listeners. menuItemKeyboardEvents.setSelected(true); menuItemButtonEvents.setSelected(true); menuItemMotionEvents.setSelected(true); menuItemWheelEvents.setSelected(true); } /** * Finalize and exit the program. * * @see java.awt.event.WindowListener#windowClosed(java.awt.event.WindowEvent) */ public void windowClosed(WindowEvent e) { // Clean up the native hook. try { GlobalScreen.unregisterNativeHook(); } catch (NativeHookException ex) { ex.printStackTrace(); } System.runFinalization(); System.exit(0); } /** * The demo project entry point. * * @param args unused. */ public static void main(String[] args) { StringBuffer copyright = new StringBuffer("\n") .append("JNativeHook: Global keyboard and mouse hooking for Java.\n") .append("Copyright (C) 2006-2016 Alexander Barker. All Rights Received.\n") .append("https://github.com/kwhat/jnativehook/\n") .append("\n") .append("JNativeHook is free software: you can redistribute it and/or modify\n") .append("it under the terms of the GNU Lesser General Public License as published\n") .append("by the Free Software Foundation, either version 3 of the License, or\n") .append("(at your option) any later version.\n") .append("\n") .append("JNativeHook is distributed in the hope that it will be useful,\n") .append("but WITHOUT ANY WARRANTY; without even the implied warranty of\n") .append("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") .append("GNU General Public License for more details.\n") .append("\n") .append("You should have received a copy of the GNU Lesser General Public License\n") .append("along with this program. If not, see .\n"); System.out.println(copyright); SwingUtilities.invokeLater(new Runnable() { public void run() { new NativeHookDemo(); } }); } /** * A simple log formatter. * * @see java.util.Formatter */ private final class LogFormatter extends Formatter { @Override public String format(LogRecord record) { StringBuilder line = new StringBuilder(); line.append(new Date(record.getMillis())) .append(" ") .append(record.getLevel().getLocalizedName()) .append(":\t") .append(formatMessage(record)); if (record.getThrown() != null) { try { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); record.getThrown().printStackTrace(pw); pw.close(); line.append(sw.toString()); sw.close(); } catch (Exception ex) { /* Do Nothing */ } } return line.toString(); } } }