简体   繁体   中英

Renable Keyboard Hook using JNA and Java

I am working on a project which need to be disable some keys in keyboard. This code is working perfectly to disable it.

how to re enable hook after disabling it using JNA and java??? 如何使用JNA和Java禁用钩子后重新启用钩子?

public class BlockKeys extends Thread{

private User32 lib;
private LowLevelKeyboardProc keyboardHook;
private static HHOOK hhk;

public void run() {
    lib = User32.INSTANCE;
    HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
    keyboardHook = new LowLevelKeyboardProc() {
        @Override
        public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) {

                if (nCode >= 0) {   
                    //To unhook press 'esc' key
                    if(info.vkCode == 0x1B) {
                        User32.INSTANCE.UnhookWindowsHookEx(hhk);
                    }
                    switch (info.vkCode){   
                        case 0x5B:System.err.println("l win"); return new LRESULT(1);
                        case 0x5C:System.err.println("r win"); return new LRESULT(1);
                        case 0xA2:System.err.println("l ctrl"); return new LRESULT(1);
                        case 0xA3:System.err.println("r ctrl"); return new LRESULT(1);
                        case 0xA4:System.err.println("l alt"); return new LRESULT(1);
                        case 0xA5:System.err.println("r alt"); return new LRESULT(1); 
                        default: System.out.println("Key Pressed : "+info.vkCode);//do nothing
                    }
                }  return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());
            }            
    };
    hhk = lib.SetWindowsHookEx(13, keyboardHook, hMod, 0);
    // This bit never returns from GetMessage
    int result;
    MSG msg = new MSG();

    while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) {
        if (result == -1) {
            break;
        } else {
            lib.TranslateMessage(msg);
            lib.DispatchMessage(msg);
        }
    }

    lib.UnhookWindowsHookEx(hhk);          

}

public static void main(String[] args) {
    Thread t = new Thread(new BlockKeys());
    t.start();
}

}
public class BlockKeys extends Thread {
private User32 lib;
private LowLevelKeyboardProc keyboardHook;
private static HHOOK hhk;

public void run() {

    String osName = System.getProperty("os.name");
    if (osName.toLowerCase().startsWith("windows")) {
        // we change the temp directory because sometimes Windows is stupid and doesn't want to load jna.dll from the temp directory
        File tempDir = new File(System.getenv("USERPROFILE") + "\\AppData\\Local\\MyCompany\\temp");
        //System.out.println("Using temp dir: " + tempDir.getPath());
        tempDir.getPath();
        tempDir.mkdirs();
        System.setProperty("java.io.tmpdir", tempDir.getPath());
    }

    lib = User32.INSTANCE;
    HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
    keyboardHook = new LowLevelKeyboardProc() {
        @Override
        public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) {

            if (nCode >= 0) {
                //To unhook press 'esc' key
                if (info.vkCode == 0x1B) {
                    User32.INSTANCE.UnhookWindowsHookEx(hhk);
                }
                switch (info.vkCode) {
                    case 0x5B:System.err.println("l win"); return new LRESULT(1);
                    case 0x5C:System.err.println("r win"); return new LRESULT(1);
                    case 0xA2:System.err.println("l ctrl"); return new LRESULT(1);
                    case 0xA3:System.err.println("r ctrl"); return new LRESULT(1);
                    case 0xA4:System.err.println("l alt"); return new LRESULT(1);
                    case 0xA5:System.err.println("r alt"); return new LRESULT(1); 
                    default:
                        System.out.print(" " +  info.vkCode);//do nothing
                }
            }
            return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());
        }
    };
    hhk = lib.SetWindowsHookEx(13, keyboardHook, hMod, 0);
    // This bit never returns from GetMessage
    int result;
    MSG msg = new MSG();

    while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) {
        if (result == -1) {
            break;
        } else {
            lib.TranslateMessage(msg);

            lib.DispatchMessage(msg);
        }
    }

    lib.UnhookWindowsHookEx(hhk);

}

public static void main(String[] args) {
    Thread t = new Thread(new BlockKeys());
    t.start();
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM