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.