gpt4 book ai didi

java - 使用 jna 进行 keyhook 和消费

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:35:23 25 4
gpt4 key购买 nike

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

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

通过返回新的 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);
}
}

最佳答案

是的,不要打电话

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

在回调方法中,...但这是一件邪恶的事情,不是吗?即使不是邪恶的,也有潜在的危险。

关于java - 使用 jna 进行 keyhook 和消费,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8540891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com