使用jna来keyhook和消费 [英] Using jna to keyhook and consume

查看:138
本文介绍了使用jna来keyhook和消费的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作一个自动点击器,它使用jna来连接键盘和鼠标的全局输入。对于键盘钩我使用 http://code.google.com/p/goldriver/source/browse/trunk/king/src/jnacontrib/w32keyhook/KeyHook.java?r=36



我想知道是否有任何可能的方法来消费关键事件,以便其他应用程序不处理它?<​​/ p>

修复了返回new LRESULT(1);



现在我遇到了问题,没有继续使用其余的代码,这里是源代码。我的程序一直在监听键盘输入,并且不会继续显示GUI。

  public class GUI扩展了javax.swing。 JFrame {

ArrayList< MEvent>事件;

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;
私人字符串显示;

私人JTable事件;
DefaultTableModel列表;
装载机装载机;
私有静态MouseHook mh;
静态私钥KeyHook kh;
静态GUI gui;
机器人机器人;

/ **创建新表格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(睡眠);
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);
}
});


}

}

公共类KeyHook实现Runnable {
private static volatile boolean quit;
private static HHOOK hhk;
私有静态LowLevelKeyboardProc keyboardHook;

私人桂贵;
User32 lib;
HMODULE hMod;
public boolean isHooked = false;

公共KeyHook(最终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
案例0x76:
System.out.println(F7);
gui.listen();
休息;

// F8
案例0x77:
System.out.println(F8);
gui.stopListening();
休息;
// F9
案例0x78:
//System.out.println (\"F9);
//gui.start();
休息;
// F10
案例0x79:
//gui.pause();
休息;
// F11
case 0x7A:
//gui.stop();
休息;
// ESC
情况0x1B:
quit = true;
休息;
}
休息;
case WinUser.WM_KEYDOWN:

break;
case WinUser.WM_SYSKEYUP:

break;
case WinUser.WM_SYSKEYDOWN:

break;
}
}
返回新的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(例外e){
e.printStackTrace();
}
}
System.err.println(unhook and exit);
lib.UnhookWindowsHookEx(hhk);
System.exit(0);
}
} .start();

//这个位永远不会从GetMessage
int result返回;
MSG msg = new MSG();
while((result = lib.GetMessage(msg,null,0,0))!= 0){
if(result == -1){
System.err.println( 获取消息中的错误);
休息;
} else {
System.err.println(got message);
lib.TranslateMessage(msg);
lib.DispatchMessage(msg);
}
}
lib.UnhookWindowsHookEx(hhk);
}
}


解决方案

是的,不要调用

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

在回电方式中,......但这是一件很邪恶的事情,isn'是吗?如果不是邪恶,有潜在危险。


I'm making an auto clicker that uses jna to hook global input from the keyboard and mouse. For the keyboard hook im using http://code.google.com/p/goldriver/source/browse/trunk/king/src/jnacontrib/w32keyhook/KeyHook.java?r=36.

I was wondering if there was any possible way to consume the key event so other applications don't process it?

Fixed with return new LRESULT (1);

Now I'm having a problem with it not continuing with the rest of the code, here is the source. My program keeps listening for keyboard input and doesn't continue to even show the 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);
}
}

解决方案

Yeah, don't call

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

In the call back method, ... but that's kind of an evil thing to do, isn't it? And if not evil, potentially dangerous.

这篇关于使用jna来keyhook和消费的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆