Использование JNA для Keyhook и потреблять

Я делаю автоматический кликер, который использует JNA для подключения глобального ввода с клавиатуры и мыши. Для работы с клавиатурой я использую http://code.google.com/p/goldriver/source/browse/trunk/king/src/jnacontrib/w32keyhook/KeyHook.java?r=36.

Мне было интересно, есть ли какой-нибудь возможный способ использовать ключевое событие, чтобы другие приложения не обрабатывали его?

Исправлено с возвратом нового LRESULT (1);

Теперь у меня проблема с этим, не продолжая с остальным кодом, вот источник. Моя программа продолжает слушать ввод с клавиатуры и даже не отображает графический интерфейс.

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);
}
}

1 ответ

Решение

Да не звони

return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());

В методе обратного вызова... но это своего рода зло, не так ли? А если не зло, то потенциально опасно.

Другие вопросы по тегам