我正在制作一个自动点击器,它使用 jna 来挂钩来自键盘和鼠标的全局输入。对于使用http://code.google.com/p/goldriver/source/browse/trunk/king/src/jnacontrib/w32keyhook/KeyHook.java?r=36的键盘挂钩。
我想知道是否有任何可能的方式来消费关键事件,以便其他应用程序不处理它?
通过返回新的 LRESULT (1) 修复;
现在我遇到了一个问题,它不能继续使用其余的代码,这里是源代码。我的程序一直在监听键盘输入,甚至不继续显示 GUI。
public class GUI extends javax.swing.JFrame{
ArrayList<MEvent> events;
public static final int RUNNING = 0;
public static final int PAUSED = 1;
public static final int STOPPED = 2;
public static final int LISTENING = 3;
private int process = STOPPED;
private String display;
private JTable Events;
DefaultTableModel list;
Loader loader;
private static MouseHook mh;
static private KeyHook kh;
static GUI gui;
Robot robot;
/** Creates new form GUI */
public GUI() {
initComponents();
loader = new Loader(this);
events = new ArrayList<MEvent>();
list = new DefaultTableModel();
mh = new MouseHook(this,list);
mh.setMouseHook();
list.addColumn("Type");
list.addColumn("X");
list.addColumn("Y");
list.addColumn("Sleep");
try {
robot = new Robot();
} catch (AWTException ex) {}
displayProcess(process);
Events.setModel(list);
kh = new KeyHook(this);
kh.run();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
gui = new GUI();
gui.setVisible(true);
}
});
}
}
public class KeyHook implements Runnable{
private static volatile boolean quit;
private static HHOOK hhk;
private static LowLevelKeyboardProc keyboardHook;
private GUI gui;
User32 lib;
HMODULE hMod;
public boolean isHooked = false;
public KeyHook(final GUI gui) {
this.gui = gui;
lib = User32.INSTANCE;
hMod = Kernel32.INSTANCE.GetModuleHandle(null);
Native.setProtected(true);
}
@Override
public void run() {
keyboardHook = new LowLevelKeyboardProc() {
public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) {
if (nCode >= 0) {
switch (wParam.intValue()) {
case WinUser.WM_KEYUP:
switch(info.vkCode){
//F7
case 0x76:
System.out.println("F7");
gui.listen();
break;
//F8
case 0x77:
System.out.println("F8");
gui.stopListening();
break;
//F9
case 0x78:
//System.out.println("F9");
//gui.start();
break;
//F10
case 0x79:
//gui.pause();
break;
//F11
case 0x7A:
//gui.stop();
break;
//ESC
case 0x1B:
quit = true;
break;
}
break;
case WinUser.WM_KEYDOWN:
break;
case WinUser.WM_SYSKEYUP:
break;
case WinUser.WM_SYSKEYDOWN:
break;
}
}
return new LRESULT(1);//lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());//
}
};
hhk = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, keyboardHook, hMod, 0);
//noinspection ConstantConditions
new Thread() {
public void run() {
while (!quit) {
try {
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
}
System.err.println("unhook and exit");
lib.UnhookWindowsHookEx(hhk);
System.exit(0);
}
}.start();
// This bit never returns from GetMessage
int result;
MSG msg = new MSG();
while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) {
if (result == -1) {
System.err.println("error in get message");
break;
} else {
System.err.println("got message");
lib.TranslateMessage(msg);
lib.DispatchMessage(msg);
}
}
lib.UnhookWindowsHookEx(hhk);
}
}