Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

512
LINES

< > BotCompany Repo | #1010546 // Test JNativeHook (global key & mouse listeners) [WORKS, tested on Linux & Windows]

JavaX source code (desktop) [tags: use-pretranspiled] - run with: x30.jar

Download Jar. Uses 408K of libraries. Click here for Pure Java version (590L/5K).

1  
!7
2  
3  
lib 1010545 // JNativeHook
4  
5  
/* JNativeHook: Global keyboard and mouse hooking for Java.
6  
 * Copyright (C) 2006-2016 Alexander Barker.  All Rights Received.
7  
 * https://github.com/kwhat/jnativehook/
8  
 *
9  
 * JNativeHook is free software: you can redistribute it and/or modify
10  
 * it under the terms of the GNU Lesser General Public License as published
11  
 * by the Free Software Foundation, either version 3 of the License, or
12  
 * (at your option) any later version.
13  
 *
14  
 * JNativeHook is distributed in the hope that it will be useful,
15  
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  
 * GNU General Public License for more details.
18  
 *
19  
 * You should have received a copy of the GNU Lesser General Public License
20  
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  
 */
22  
23  
// Imports.
24  
import org.jnativehook.GlobalScreen;
25  
import org.jnativehook.NativeHookException;
26  
import org.jnativehook.NativeInputEvent;
27  
import org.jnativehook.dispatcher.SwingDispatchService;
28  
import org.jnativehook.keyboard.NativeKeyEvent;
29  
import org.jnativehook.keyboard.NativeKeyListener;
30  
import org.jnativehook.mouse.NativeMouseEvent;
31  
import org.jnativehook.mouse.NativeMouseInputListener;
32  
import org.jnativehook.mouse.NativeMouseWheelEvent;
33  
import org.jnativehook.mouse.NativeMouseWheelListener;
34  
import javax.swing.JCheckBoxMenuItem;
35  
import javax.swing.JFrame;
36  
import javax.swing.JMenu;
37  
import javax.swing.JMenuBar;
38  
import javax.swing.JMenuItem;
39  
import javax.swing.JScrollPane;
40  
import javax.swing.JTextArea;
41  
import javax.swing.KeyStroke;
42  
import javax.swing.SwingUtilities;
43  
import javax.swing.WindowConstants;
44  
import javax.swing.text.BadLocationException;
45  
import java.awt.BorderLayout;
46  
import java.awt.Color;
47  
import java.awt.Dimension;
48  
import java.awt.ItemSelectable;
49  
import java.awt.event.ActionEvent;
50  
import java.awt.event.ActionListener;
51  
import java.awt.event.ItemEvent;
52  
import java.awt.event.ItemListener;
53  
import java.awt.event.KeyEvent;
54  
import java.awt.event.WindowEvent;
55  
import java.awt.event.WindowListener;
56  
import java.io.PrintWriter;
57  
import java.io.StringWriter;
58  
import java.util.Date;
59  
import java.util.logging.ConsoleHandler;
60  
import java.util.logging.Formatter;
61  
import java.util.logging.Level;
62  
import java.util.logging.LogRecord;
63  
import java.util.logging.Logger;
64  
65  
p { NativeHookDemo.main(args); }
66  
67  
/**
68  
 * A demonstration of how to use the JNativeHook library.
69  
 *
70  
 * @author	Alexander Barker (<a href="mailto:alex@1stleg.com">alex@1stleg.com</a>)
71  
 * @version	2.0
72  
 * @since	1.0
73  
 *
74  
 * @see GlobalScreen
75  
 * @see NativeKeyListener
76  
 */
77  
public sclass NativeHookDemo extends JFrame implements ActionListener, ItemListener, NativeKeyListener, NativeMouseInputListener, NativeMouseWheelListener, WindowListener {
78  
	/** The Constant serialVersionUID. */
79  
	private static final long serialVersionUID = 1541183202160543102L;
80  
81  
	/** Menu Items */
82  
	private JMenu menuSubListeners;
83  
	private JMenuItem menuItemQuit, menuItemClear;
84  
	private JCheckBoxMenuItem menuItemEnable, menuItemKeyboardEvents, menuItemButtonEvents, menuItemMotionEvents, menuItemWheelEvents;
85  
86  
	/** The text area to display event info. */
87  
	private JTextArea txtEventInfo;
88  
89  
	/** Logging */
90  
	private static final Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName());
91  
92  
	/**
93  
	 * Instantiates a new native hook demo.
94  
	 */
95  
	public NativeHookDemo() {
96  
		// Setup the main window.
97  
		setTitle("JNativeHook Demo");
98  
		setLayout(new BorderLayout());
99  
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
100  
		setSize(600, 300);
101  
		addWindowListener(this);
102  
103  
		JMenuBar menuBar = new JMenuBar();
104  
105  
		// Create the file menu.
106  
		JMenu menuFile = new JMenu("File");
107  
		menuFile.setMnemonic(KeyEvent.VK_F);
108  
		menuBar.add(menuFile);
109  
110  
		menuItemQuit = new JMenuItem("Quit", KeyEvent.VK_Q);
111  
		menuItemQuit.addActionListener(this);
112  
		menuItemQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, ActionEvent.ALT_MASK));
113  
		menuItemQuit.getAccessibleContext().setAccessibleDescription("Exit the program");
114  
		menuFile.add(menuItemQuit);
115  
116  
		// Create the view.
117  
		JMenu menuView = new JMenu("View");
118  
		menuView.setMnemonic(KeyEvent.VK_V);
119  
		menuBar.add(menuView);
120  
121  
		menuItemClear = new JMenuItem("Clear", KeyEvent.VK_C);
122  
		menuItemClear.addActionListener(this);
123  
		menuItemClear.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK));
124  
		menuItemClear.getAccessibleContext().setAccessibleDescription("Clear the screen");
125  
		menuView.add(menuItemClear);
126  
127  
		menuView.addSeparator();
128  
129  
		menuItemEnable = new JCheckBoxMenuItem("Enable Native Hook");
130  
		menuItemEnable.addItemListener(this);
131  
		menuItemEnable.setMnemonic(KeyEvent.VK_H);
132  
		menuItemEnable.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK));
133  
		menuView.add(menuItemEnable);
134  
135  
		// Create the listeners sub menu.
136  
		menuSubListeners = new JMenu("Listeners");
137  
		menuSubListeners.setMnemonic(KeyEvent.VK_L);
138  
		menuView.add(menuSubListeners);
139  
140  
		menuItemKeyboardEvents = new JCheckBoxMenuItem("Keyboard Events");
141  
		menuItemKeyboardEvents.addItemListener(this);
142  
		menuItemKeyboardEvents.setMnemonic(KeyEvent.VK_K);
143  
		menuItemKeyboardEvents.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_K, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK));
144  
		menuSubListeners.add(menuItemKeyboardEvents);
145  
146  
		menuItemButtonEvents = new JCheckBoxMenuItem("Button Events");
147  
		menuItemButtonEvents.addItemListener(this);
148  
		menuItemButtonEvents.setMnemonic(KeyEvent.VK_B);
149  
		menuItemButtonEvents.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK));
150  
		menuSubListeners.add(menuItemButtonEvents);
151  
152  
		menuItemMotionEvents = new JCheckBoxMenuItem("Motion Events");
153  
		menuItemMotionEvents.addItemListener(this);
154  
		menuItemMotionEvents.setMnemonic(KeyEvent.VK_M);
155  
		menuItemMotionEvents.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK));
156  
		menuSubListeners.add(menuItemMotionEvents);
157  
158  
		menuItemWheelEvents = new JCheckBoxMenuItem("Wheel Events");
159  
		menuItemWheelEvents.addItemListener(this);
160  
		menuItemWheelEvents.setMnemonic(KeyEvent.VK_W);
161  
		menuItemWheelEvents.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, ActionEvent.CTRL_MASK + ActionEvent.SHIFT_MASK));
162  
		menuSubListeners.add(menuItemWheelEvents);
163  
164  
		setJMenuBar(menuBar);
165  
166  
		// Create feedback area.
167  
		txtEventInfo = new JTextArea();
168  
		txtEventInfo.setEditable(false);
169  
		txtEventInfo.setBackground(new Color(0xFF, 0xFF, 0xFF));
170  
		txtEventInfo.setForeground(new Color(0x00, 0x00, 0x00));
171  
		txtEventInfo.setText("");
172  
173  
		JScrollPane scrollPane = new JScrollPane(txtEventInfo);
174  
		scrollPane.setPreferredSize(new Dimension(375, 125));
175  
		add(scrollPane, BorderLayout.CENTER);
176  
177  
178  
		// Disable parent logger and set the desired level.
179  
		logger.setUseParentHandlers(false);
180  
		logger.setLevel(Level.ALL);
181  
182  
		// Add our custom formatter to a console handler.
183  
		ConsoleHandler handler = new ConsoleHandler();
184  
		handler.setFormatter(new LogFormatter());
185  
		handler.setLevel(Level.WARNING);
186  
		logger.addHandler(handler);
187  
188  
		/* Note: JNativeHook does *NOT* operate on the event dispatching thread.
189  
		 * Because Swing components must be accessed on the event dispatching
190  
		 * thread, you *MUST* wrap access to Swing components using the
191  
		 * SwingUtilities.invokeLater() or EventQueue.invokeLater() methods.
192  
		 */
193  
		GlobalScreen.setEventDispatcher(new SwingDispatchService());
194  
		
195  
		setVisible(true);
196  
	}
197  
198  
	/**
199  
	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
200  
	 */
201  
	public void actionPerformed(ActionEvent e) {
202  
		if (e.getSource() == menuItemQuit) {
203  
			this.dispose();
204  
		}
205  
		else if (e.getSource() == menuItemClear) {
206  
			txtEventInfo.setText("");
207  
		}
208  
	}
209  
210  
	/**
211  
	 * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
212  
	 */
213  
	public void itemStateChanged(ItemEvent e) {
214  
		ItemSelectable item = e.getItemSelectable();
215  
216  
		if (item == menuItemEnable) {
217  
			try {
218  
				// Keyboard checkbox was changed, adjust listeners accordingly.
219  
				if (e.getStateChange() == ItemEvent.SELECTED) {
220  
					// Initialize native hook.  This is done on window open because the
221  
					// listener requires the txtEventInfo object to be constructed.
222  
					GlobalScreen.registerNativeHook();
223  
				}
224  
				else {
225  
					GlobalScreen.unregisterNativeHook();
226  
				}
227  
			}
228  
			catch (NativeHookException ex) {
229  
				txtEventInfo.append("Error: " + ex.getMessage() + "\n");
230  
			}
231  
232  
			// Set the enable menu item to the state of the hook.
233  
			menuItemEnable.setState(GlobalScreen.isNativeHookRegistered());
234  
235  
			// Set enable/disable the sub-menus based on the enable menu item's state.
236  
			menuSubListeners.setEnabled(menuItemEnable.getState());
237  
		}
238  
		else if (item == menuItemKeyboardEvents) {
239  
			// Keyboard checkbox was changed, adjust listeners accordingly
240  
			if (e.getStateChange() == ItemEvent.SELECTED) {
241  
				GlobalScreen.addNativeKeyListener(this);
242  
			}
243  
			else {
244  
				GlobalScreen.removeNativeKeyListener(this);
245  
			}
246  
		}
247  
		else if (item == menuItemButtonEvents) {
248  
			// Button checkbox was changed, adjust listeners accordingly
249  
			if (e.getStateChange() == ItemEvent.SELECTED) {
250  
				GlobalScreen.addNativeMouseListener(this);
251  
			}
252  
			else {
253  
				GlobalScreen.removeNativeMouseListener(this);
254  
			}
255  
		}
256  
		else if (item == menuItemMotionEvents) {
257  
			// Motion checkbox was changed, adjust listeners accordingly
258  
			if (e.getStateChange() == ItemEvent.SELECTED) {
259  
				GlobalScreen.addNativeMouseMotionListener(this);
260  
			}
261  
			else {
262  
				GlobalScreen.removeNativeMouseMotionListener(this);
263  
			}
264  
		}
265  
		else if (item == menuItemWheelEvents) {
266  
			// Motion checkbox was changed, adjust listeners accordingly
267  
			if (e.getStateChange() == ItemEvent.SELECTED) {
268  
				GlobalScreen.addNativeMouseWheelListener(this);
269  
			}
270  
			else {
271  
				GlobalScreen.removeNativeMouseWheelListener(this);
272  
			}
273  
		}
274  
	}
275  
276  
	/**
277  
	 * @see org.jnativehook.keyboard.NativeKeyListener#nativeKeyPressed(org.jnativehook.keyboard.NativeKeyEvent)
278  
	 */
279  
	public void nativeKeyPressed(NativeKeyEvent e) {
280  
		displayEventInfo(e);
281  
	}
282  
283  
	/**
284  
	 * @see org.jnativehook.keyboard.NativeKeyListener#nativeKeyReleased(org.jnativehook.keyboard.NativeKeyEvent)
285  
	 */
286  
	public void nativeKeyReleased(NativeKeyEvent e) {
287  
		displayEventInfo(e);
288  
	}
289  
290  
	/**
291  
	 * @see org.jnativehook.keyboard.NativeKeyListener#nativeKeyTyped(org.jnativehook.keyboard.NativeKeyEvent)
292  
	 */
293  
	public void nativeKeyTyped(NativeKeyEvent e) {
294  
		displayEventInfo(e);
295  
	}
296  
297  
	/**
298  
	 * @see org.jnativehook.mouse.NativeMouseListener#nativeMouseClicked(org.jnativehook.mouse.NativeMouseEvent)
299  
	 */
300  
	public void nativeMouseClicked(NativeMouseEvent e) {
301  
		displayEventInfo(e);
302  
	}
303  
304  
	/**
305  
	 * @see org.jnativehook.mouse.NativeMouseListener#nativeMousePressed(org.jnativehook.mouse.NativeMouseEvent)
306  
	 */
307  
	public void nativeMousePressed(NativeMouseEvent e) {
308  
		displayEventInfo(e);
309  
	}
310  
311  
	/**
312  
	 * @see org.jnativehook.mouse.NativeMouseListener#nativeMouseReleased(org.jnativehook.mouse.NativeMouseEvent)
313  
	 */
314  
	public void nativeMouseReleased(NativeMouseEvent e) {
315  
		displayEventInfo(e);
316  
	}
317  
318  
	/**
319  
	 * @see org.jnativehook.mouse.NativeMouseMotionListener#nativeMouseMoved(org.jnativehook.mouse.NativeMouseEvent)
320  
	 */
321  
	public void nativeMouseMoved(NativeMouseEvent e) {
322  
		displayEventInfo(e);
323  
	}
324  
325  
	/**
326  
	 * @see org.jnativehook.mouse.NativeMouseMotionListener#nativeMouseDragged(org.jnativehook.mouse.NativeMouseEvent)
327  
	 */
328  
	public void nativeMouseDragged(NativeMouseEvent e) {
329  
		displayEventInfo(e);
330  
	}
331  
332  
	/**
333  
	 * @see org.jnativehook.mouse.NativeMouseWheelListener#nativeMouseWheelMoved(org.jnativehook.mouse.NativeMouseWheelEvent)
334  
	 */
335  
	public void nativeMouseWheelMoved(NativeMouseWheelEvent e) {
336  
		displayEventInfo(e);
337  
	}
338  
339  
	/**
340  
	 * Write information about the <code>NativeInputEvent</code> to the text
341  
	 * window.
342  
	 *
343  
	 * @param e the native input event to display.
344  
	 */
345  
	private void displayEventInfo(final NativeInputEvent e) {
346  
		txtEventInfo.append("\n" + e.paramString());
347  
348  
		try {
349  
			//Clean up the history to reduce memory consumption.
350  
			if (txtEventInfo.getLineCount() > 100) {
351  
				txtEventInfo.replaceRange("", 0, txtEventInfo.getLineEndOffset(txtEventInfo.getLineCount() - 1 - 100));
352  
			}
353  
354  
			txtEventInfo.setCaretPosition(txtEventInfo.getLineStartOffset(txtEventInfo.getLineCount() - 1));
355  
		}
356  
		catch (BadLocationException ex) {
357  
			txtEventInfo.setCaretPosition(txtEventInfo.getDocument().getLength());
358  
		}
359  
	}
360  
361  
	/**
362  
	 * Unimplemented
363  
	 *
364  
	 * @see java.awt.event.WindowListener#windowActivated(java.awt.event.WindowEvent)
365  
	 */
366  
	public void windowActivated(WindowEvent e) { /* Do Nothing */ }
367  
368  
	/**
369  
	 * Unimplemented
370  
	 *
371  
	 * @see java.awt.event.WindowListener#windowClosing(java.awt.event.WindowEvent)
372  
	 */
373  
	public void windowClosing(WindowEvent e) { /* Do Nothing */ }
374  
375  
	/**
376  
	 * Unimplemented
377  
	 *
378  
	 * @see java.awt.event.WindowListener#windowDeactivated(java.awt.event.WindowEvent)
379  
	 */
380  
	public void windowDeactivated(WindowEvent e) { /* Do Nothing */ }
381  
382  
	/**
383  
	 * Unimplemented
384  
	 *
385  
	 * @see java.awt.event.WindowListener#windowDeiconified(java.awt.event.WindowEvent)
386  
	 */
387  
	public void windowDeiconified(WindowEvent e) { /* Do Nothing */ }
388  
389  
	/**
390  
	 * Unimplemented
391  
	 *
392  
	 * @see java.awt.event.WindowListener#windowIconified(java.awt.event.WindowEvent)
393  
	 */
394  
	public void windowIconified(WindowEvent e) { /* Do Nothing */ }
395  
396  
	/**
397  
	 * Display information about the native keyboard and mouse along with any
398  
	 * errors that may have occurred.
399  
	 *
400  
	 * @see java.awt.event.WindowListener#windowOpened(java.awt.event.WindowEvent)
401  
	 */
402  
	public void windowOpened(WindowEvent e) {
403  
		// Return the focus to the window.
404  
		this.requestFocusInWindow();
405  
406  
		// Enable the hook, this will cause the GlobalScreen to be initilized.
407  
		menuItemEnable.setSelected(true);
408  
409  
		// Please note that these properties are not available until after the GlobalScreen class is initialized.
410  
		txtEventInfo.append("JNativeHook Version " + System.getProperty("jnativehook.lib.version"));
411  
		txtEventInfo.append("\nAuto Repeat Rate: " + System.getProperty("jnativehook.key.repeat.rate"));
412  
		txtEventInfo.append("\n" + "Auto Repeat Delay: " + System.getProperty("jnativehook.key.repeat.delay"));
413  
		txtEventInfo.append("\n" + "Double Click Time: " + System.getProperty("jnativehook.button.multiclick.iterval"));
414  
		txtEventInfo.append("\n" + "Pointer Sensitivity: " + System.getProperty("jnativehook.pointer.sensitivity"));
415  
		txtEventInfo.append("\n" + "Pointer Acceleration Multiplier: " + System.getProperty("jnativehook.pointer.acceleration.multiplier"));
416  
		txtEventInfo.append("\n" + "Pointer Acceleration Threshold: " + System.getProperty("jnativehook.pointer.acceleration.threshold"));
417  
418  
		try {
419  
			txtEventInfo.setCaretPosition(txtEventInfo.getLineStartOffset(txtEventInfo.getLineCount() - 1));
420  
		}
421  
		catch (BadLocationException ex) {
422  
			txtEventInfo.setCaretPosition(txtEventInfo.getDocument().getLength());
423  
		}
424  
425  
		// Enable all of the listeners.
426  
		menuItemKeyboardEvents.setSelected(true);
427  
		menuItemButtonEvents.setSelected(true);
428  
		menuItemMotionEvents.setSelected(true);
429  
		menuItemWheelEvents.setSelected(true);
430  
	}
431  
432  
	/**
433  
	 * Finalize and exit the program.
434  
	 *
435  
	 * @see java.awt.event.WindowListener#windowClosed(java.awt.event.WindowEvent)
436  
	 */
437  
	public void windowClosed(WindowEvent e) {
438  
		// Clean up the native hook.
439  
		try {
440  
			GlobalScreen.unregisterNativeHook();
441  
		}
442  
		catch (NativeHookException ex) {
443  
			ex.printStackTrace();
444  
		}
445  
		System.runFinalization();
446  
		System.exit(0);
447  
	}
448  
449  
	/**
450  
	 * The demo project entry point.
451  
	 *
452  
	 * @param args unused.
453  
	 */
454  
	public static void main(String[] args) {
455  
		StringBuffer copyright = new StringBuffer("\n")
456  
				.append("JNativeHook: Global keyboard and mouse hooking for Java.\n")
457  
				.append("Copyright (C) 2006-2016 Alexander Barker.  All Rights Received.\n")
458  
				.append("https://github.com/kwhat/jnativehook/\n")
459  
				.append("\n")
460  
				.append("JNativeHook is free software: you can redistribute it and/or modify\n")
461  
				.append("it under the terms of the GNU Lesser General Public License as published\n")
462  
				.append("by the Free Software Foundation, either version 3 of the License, or\n")
463  
				.append("(at your option) any later version.\n")
464  
				.append("\n")
465  
				.append("JNativeHook is distributed in the hope that it will be useful,\n")
466  
				.append("but WITHOUT ANY WARRANTY; without even the implied warranty of\n")
467  
				.append("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n")
468  
				.append("GNU General Public License for more details.\n")
469  
				.append("\n")
470  
				.append("You should have received a copy of the GNU Lesser General Public License\n")
471  
				.append("along with this program.  If not, see <http://www.gnu.org/licenses/>.\n");
472  
		System.out.println(copyright);
473  
474  
		SwingUtilities.invokeLater(new Runnable() {
475  
			public void run() {
476  
				new NativeHookDemo();
477  
			}
478  
		});
479  
	}
480  
481  
	/**
482  
	 * A simple log formatter.
483  
	 *
484  
	 * @see java.util.Formatter
485  
	 */
486  
	private final class LogFormatter extends Formatter {
487  
		@Override
488  
		public String format(LogRecord record) {
489  
			StringBuilder line = new StringBuilder();
490  
491  
			line.append(new Date(record.getMillis()))
492  
				.append(" ")
493  
				.append(record.getLevel().getLocalizedName())
494  
				.append(":\t")
495  
				.append(formatMessage(record));
496  
497  
			if (record.getThrown() != null) {
498  
				try {
499  
					StringWriter sw = new StringWriter();
500  
					PrintWriter pw = new PrintWriter(sw);
501  
					record.getThrown().printStackTrace(pw);
502  
					pw.close();
503  
					line.append(sw.toString());
504  
					sw.close();
505  
				}
506  
				catch (Exception ex) { /* Do Nothing */ }
507  
			}
508  
509  
			return line.toString();
510  
		}
511  
	}
512  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 21 computer(s): agtzawvjhpac, aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, hacelcvcghbr, imzmzdywqqli, ishqpsrjomds, kltaiputbqfu, krzvwbcyrync, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vezddojwiuja, vouqrxazstgt, xfasiavlzxuf

No comments. add comment

Snippet ID: #1010546
Snippet name: Test JNativeHook (global key & mouse listeners) [WORKS, tested on Linux & Windows]
Eternal ID of this version: #1010546/4
Text MD5: e4e9db878cc8b7c8105928bd4a1bc025
Transpilation MD5: f7bf3062777d739cd8b3f0d505eed8ca
Author: stefan
Category: javax / gui
Type: JavaX source code (desktop)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2017-09-20 17:07:31
Source code size: 18068 bytes / 512 lines
Pitched / IR pitched: No / No
Views / Downloads: 1386 / 1986
Version history: 3 change(s)
Referenced in: [show references]