使用 jna 进行 keyhook 和消费

2023-12-20

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

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

修复了返回新的 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());

在回调方法中,...但这样做有点邪恶,不是吗?即使不是邪恶,也有潜在的危险。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 jna 进行 keyhook 和消费 的相关文章

  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • 将处理项目移至 Eclipse

    我已经在处理项目上工作了一段时间 现在想将其移至 Eclipse 中 我已经在 Eclipse 环境中安装了 Proclipse 我有很多扩展名为 pde 的文件 然而 Proclipse 文件都以 java 结尾 所有 pde 文件都存在
  • 如何在 Android 中的 Chrome 或 Firefox 等特定浏览器的 Web 视图中加载应用程序

    我是 Android 新手 我正在做一个应用程序 我需要在平板电脑上的 Web 视图中加载现有的应用程序 在平板电脑中 当我使用 Web 视图加载应用程序时 我的应用程序将加载到默认浏览器中 如何在平板电脑上的 Web 视图中的特定浏览器
  • Selenium 和 TestNG 同时使用“dependsOn”和“priority =”问题

    我正在努力在 GUI 自动化测试中实现更好的工作流程控制 我首先从dependsOn开始 但很快发现缺点是如果一个测试失败 则套件的整个其余部分都不会运行 所以我改用 priority 但看到了意外的行为 一个例子 Test priorit
  • 使用全局变量从内部函数获取空字符串

    请帮助我解决一些小问题 我确信你能做到 D 我试图在 firestore 文档 user cases information 上设置一个字段 其中包含一个字段 case number 首先我声明这个全局变量 private String c
  • FileObserver 不适用于 Android 6.0 Marshmallow (API 23) 中的外部存储

    我有一个应用程序可以观察外部存储上的公共目录FileObserver 它运行良好Lollipop设备 我想添加对Marshmallow 所以我用它设置了一台 Nexus 9 平板电脑 在 Marshmallow 设备上 它失败 在 Loll
  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • JERSEY:错误跟踪:java.lang.IllegalStateException:实体输入流已关闭

    我正在使用 Jersey 2 x 以下是我的控制器 GET Path id Produces application json public Response getUser PathParam id int userId Context
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • ActiveMQ JNDI 查找问题

    尝试使用 JNDI 运行以下 ActiveMQ http activemq apache org jndi support html http ActiveMQ 20JNDI 并且我的 jboss server node lib 文件夹中有
  • 使用 Guava Ordering 对对象列表进行多条件排序

    我有一个类无法实现可比较 但需要根据 2 个字段进行排序 我怎样才能用番石榴实现这一目标 假设班级是 class X String stringValue java util Date dateValue 我有一个清单 List
  • 接口是否像对象一样对待?

    为什么下面的代码可以工作 interface I class A implements I public String toString return in a class B extends A public String toStrin
  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • Janusgraph 0.3.2 + HBase 1.4.9 - 无法设置 graph.timestamps

    我在 Docker 容器中运行 Janusgraph 0 3 2 并尝试使用运行 HBase 1 4 9 的 AWS EMR 集群作为存储后端 我可以运行 gremlin server sh 但如果我尝试保存某些内容 我会得到粘贴在下面的堆
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • 如何使用eclipse调试JSP tomcat服务?

    我想使用 Eclipse IDE 调试器来调试单独运行的 JSP Struts Tomcat Hibernate 应用程序堆栈 如何设置 java JVM 和 eclipse 以便设置断点 监视变量值并查看当前正在执行的代码 我刚刚用谷歌搜
  • 为什么不能在 if 语句中声明变量?

    以下 Java 代码无法编译 int a 0 if a 1 int b 0 if a 1 b 1 为什么 不能有任何代码路径导致程序将 1 分配给b无需先声明 我突然想到b的变量范围可能仅限于第一个if声明 但后来我不明白为什么 如果我实在
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用

随机推荐

  • 如何在forEach内部调用promise?

    我有事件流向下面的程序 因此基于事件值我触发了不同的承诺 所以我想检查在 forEach 中使用承诺是否是个好主意 当我有下面的代码时element variables caseIdFound如果它永远无法满足条件 则价值 任何知道实施错误
  • 是否可以在运行 Flask 应用程序的 uwsgi 进程之间共享内存?

    我想知道在 uwsgi 上运行的具有多个进程 线程的 Flask 应用程序是否可以访问 Flask 应用程序类中定义的公共内存数据结构 我正在尝试做的事情 我有一个 Flask 应用程序 它将在 nginx uwsgi 上运行 我希望每个
  • 如何固定 JFreeChart XY 图的域范围?

    我有一个 JFreeChart 图表 它显示传感器的测量值 该图应显示这些值如何随时间变化 我使用以下代码创建图表 create the chart final JFreeChart chart ChartFactory createXYL
  • Xcode / Swift:如何实现后退按钮?

    我刚刚开始使用 Xcode 和 Swift 我尝试构建我的第一个 iOS 小应用程序 但现在我遇到了问题 我不知道如何实现后退按钮 以便我回到之前的视图 我的故事板看起来像这样 当我打开 A Z 视图时 我想显示后退箭头 它将返回到 Ite
  • SWIFT 2:多行 MKPointAnnotation

    有没有办法创建多行注释 这是我的代码 1 我的customAnnotation类 import UIKit import MapKit class CustomAnnotation NSObject MKAnnotation var tit
  • Cloud Firestore 安全规则:如何检查属性是否存在?

    我需要检查商店文档中是否存在属性 allow update delete if resource data uid 在上面的代码中我有错误 属性 uid 在对象上未定义 所以我如何检查是uid在数据中 要检查文档是否包含特定字段 我使用in
  • 编程术语 - 字段、成员、属性 (C#)

    我试图找到这些术语的含义 但特别是由于语言障碍 我无法理解它们的用途 我假设 字段 在类中是变量 也是对象 而 属性 只是一个返回特定值且不能包含方法等的对象 通过 成员 我理解在类级别声明的任何对象 但这些只是我基于注释代码示例的假设 其
  • 如何在角度中默认选择垫按钮切换

    如何设置默认选择切换组中的最后一个按钮 这是我的代码
  • 通过裁判?

    我仍然对通过裁判感到困惑 如果我有一个 Cache 对象 我想访问 可供多个对象使用 并且我使用构造函数注入来注入它 我希望它影响我创建的单个缓存对象 例如 public class Cache public void Remove str
  • HTC One M7 上的语音识别器

    我使用 android 的内置语音识别类编写了一个语音识别应用程序 当对使用 createSpeechRecognizer context 函数获取的语音识别器对象调用 startListening 函数时 我的开发人员控制台中会出现以下异
  • Jquery 确认示例

    我想要更多关于 jquery 确认框的示例 我通过下面的例子学会了如何显示确认对话框 http www webstuffshare com 2010 03 jquery plugin jconfirmaction http www webs
  • Laravel 对象到数组

    我尝试了一段时间使用数组而不是集合 就像 Laravel 那样 我尝试执行此方法 但没有成功 Event listen StatementPrepared class function event event gt statement gt
  • foreach 中的 Javascript setTimeout:需要帮助创建闭包

    我有这个功能 notes forEach function note setTimeout function playNote note 1000 这是行不通的 它会同时播放所有音符 而不是按顺序播放 中间间隔 1 秒 看起来我需要在这里关
  • C++ 11 线程,错误调用纯虚函数

    这是我正在尝试编译的一个非常小的 C 11 Thread API 代码 include
  • Gulp 4 使用 Gulp-Hub 将任务拆分到多个文件由于缺少 Get 函数而失败

    使用 Gulp 4 和recipe https github com gulpjs gulp blob 4 0 docs recipes split tasks across multiple files md使用 gulp hub 将我的
  • 为链接列表或任何类型的列表添加侦听器

    我有一个链接列表 我只想监听任何更改 例如添加到链接列表中的内容 最好的方法是什么 您可以尝试 ObservableCollection See http commons apache org dormant events apidocs
  • 选择两列的组合,并计算该组合的出现次数

    我有一个包含问题的表 其中每一行都是一个问题 所有问题都有一个 questions by 和answer by 字段 我想选择 提问者 和 回答者 的所有独特组合 并计算这种提问 回答组合发生的次数 question tbl id aske
  • 如何使用 ZMQ 发送/接收通过 Protocol Buffers 序列化的二进制数据

    我需要在 ZMQ 套接字上发送一个对象 用 GPB 序列化 目前该代码有一个额外的副本 如何直接将序列化数组写入message ts data ABT CommunicationProtocol introPacket Fill the p
  • 如何获取特定时间段内所有推文的样本?

    我想收集去年所有推文的样本 能够请求特定日期的推文固然很棒 但我会尽力而为 我不想查找特定用户的推文或包含特定术语的推文 而只是查找所有推文的样本 这推特搜索 API http apiwiki twitter com w page 2255
  • 使用 jna 进行 keyhook 和消费

    我正在制作一个自动点击器 它使用 jna 来挂钩来自键盘和鼠标的全局输入 对于我使用的键盘挂钩http code google com p goldriver source browse trunk king src jnacontrib