使用jna消费按键事件

2023-12-01

在我正在编写的应用程序之一中,我需要使用某些关键事件,以便其他应用程序不处理它们。

在我的代码中,我创建了一个 com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc,如下所示:

import com.sun.jna.Native;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser.HHOOK;
import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT;
import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinUser;

public class KeyHook implements Runnable{

private static volatile boolean quit = false;
private static HHOOK hhk;
private static LowLevelKeyboardProc keyboardHook;

private Main main;
User32 lib;
HMODULE hMod;
public boolean isHooked = false;

public KeyHook(final Main main) {
    this.main = main;
    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 && main.getPane().getTabCount() > 0) {
                switch (wParam.intValue()) {
                    case WinUser.WM_KEYUP:
                        if(info.vkCode == main.getListenMouse()){
                            main.listen();
                            return new LRESULT(1);
                        }
                        else if(info.vkCode == main.getStopListenMouse()){
                            main.stopListening();
                            return new LRESULT(1);
                        }
                        else if(info.vkCode == main.getStart()){
                            main.start();
                            return new LRESULT(1);
                        }
                        else if(info.vkCode == main.getPause()){
                            main.pause();
                            return new LRESULT(1);
                        }
                        else if(info.vkCode == main.getStop()){
                            main.stopRunning();
                            return new LRESULT(1);
                        }
                        else if(info.vkCode == 0x7B){
                            main.nextTab();
                            return new LRESULT(1);
                        }
                        break;
                    case WinUser.WM_KEYDOWN:
                       break;
                    case WinUser.WM_SYSKEYUP:
                        break;
                    case WinUser.WM_SYSKEYDOWN:
                        quit = true;
                        break;
                }
            }
            return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());
            //return new LRESULT(1);
        }
    };
    hhk = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, keyboardHook, hMod, 0);
}
}

当我在过程末尾返回一个新的 LRESULT(1) 时(在末尾注释掉代码),所有键盘事件都会被消耗。但是,当我将其替换为

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

正如它应该的那样,并且只尝试消耗我想要消耗的主键盘事件,它不会消耗任何键盘事件。有谁知道为什么它不允许我消费我想要的事件,或者知道如何修复它,这样它就会发生?


为了确保某个键被“消耗”,您需要确保避免在给定键的所有事件变体(即 WM_KEYUP、WM_KEYDOWN 和可能的 WM_CHAR)上调用下一个钩子(即返回 LRESULT(1))。

某些应用程序可能会查找按键按下事件,其他应用程序可能会查找按键按下事件,而其他应用程序可能只是查找生成的字符输出,因此您必须使用all与给定击键相关的事件使所述击键正确“消失”。

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

使用jna消费按键事件 的相关文章

随机推荐

  • Python 中的链式比较数字范围

    我有以下功能 def InRange number return 5 lt number gt 1 如果使用链式比较该数字不在 1 到 5 的范围内 我希望此值为 false 但似乎无法正确执行此操作 有什么建议么 你想要这样的 def I
  • 如何将文件从 JavaScript 传递到 PHP? [复制]

    这个问题在这里已经有答案了 是否可以将文件从 JavaScript 传递到 PHP 最好使用ajax 如果我们有以下代码
  • 无法登录 mssql-server-linux 容器中的 SQL Server

    我不情愿地执行尝试在 docker 容器中使用 Microsoft SQL Server 的耗费灵魂的任务 并且正在使用 Microsoft 提供的 mssql server linux 盒子 但无论我做什么我都无法登录 这是我的 dock
  • 可安装的触发器以不同的形式触发脚本?

    当提交不同的表单 B 时 我尝试运行连接到一个表单 A 的脚本 我有一系列相似的不同形式 需要运行相同的脚本 因此我不知道这是否可能 而不是将代码复制到每个脚本 我成功地在 A 中制作了一个可安装的触发器函数 指向 B 当出现提示时 我已授
  • 作业 - 无法利用缓冲区溢出

    我正在尝试学习在 Backtrack Linux 上利用简单的缓冲流技术 这是我的 C 程序 include
  • python-pptx:将图片插入内容占位符

    我正在使用 python pptx 0 6 0 并创建了一张包含内容和标题的幻灯片 我想将图片插入到内容占位符中 但没有诸如 add picture 或 insert picuture 之类的属性可供使用 如何将图片添加到此内容占位符中 谢
  • 使用 XSL 将所有元素名称转换为小写?

    在 XSL 中 如何在处理文档之前将文档中的所有元素名称转换为小写 我们正在使用 XSLT 2 0 并且我们已经尝试了以下方法 但它不起作用 a a
  • 向网格添加空行

    我正在尝试将行添加到我的网格中 我在文档中看到了一个例子 onAddRouteClick function Create a model instance var rec new KitchenSink model grid Plant b
  • 每次注销后 RVM 设置都会丢失

    我按照以下说明在 ubuntu 上使用 RVM 安装了 ruby rails 和 gemset http railstutorial org ruby on rails tutorial book sec rubygems 现在的问题是 每
  • 如何在android中用标记显示地图

    我正在开发 Android 应用程序 而且我在这方面完全是新手 所以我想知道如何在地图中显示标记以及如何在特定时间更改他的位置 例如定义线程或背景中的任何内容 这些内容将发送纬度和经度值并且标记在该位置上移动 如果您只想展示单个项目 Map
  • GCP Dataflow 2.0 PubSub 到 GCS

    我很难理解 TextIO write 的 withFileNamePolicy 的概念 对于像指定 GCS 存储桶来写入流式文件这样简单的事情来说 提供 FileNamePolicy 的要求似乎非常复杂 在较高级别上 我将 JSON 消息传
  • 如何运行依赖于 Android 库模块的单元测试?

    每当我尝试对应用程序模块中依赖于库模块中的类的类运行单元测试时 我都会得到以下信息 java lang NoClassDefFoundError de ivu junittest DummyData at de ivu junittest
  • 删除列表中某些连续的重复项

    我有一个这样的字符串列表 foo bar bar baz 我想更换 与单个 但离开 bar bar 完好无损的 IE 替换任意连续的数字 与一个 我当前的代码如下所示 p foo bar bar baz np p 0 for pi in r
  • 将 bash 变量作为模式传递给 awk

    我想知道如何通过bash variable as a pattern to awk 我读过几个问答 它们往往回答同一个问题 但是 它们都没有解决我的问题 可能 我错过了一些东西 我有几个这样的文件 1 9909 23121 1 23121
  • Cronjob 但适用于 jQuery/Javascript

    我正在尝试开发一个主要使用 PHP 的 Web 应用程序 但我正在使用 jQuery Javascript 从人们的 URL 中获取他们的推文 问题是想要运行 PHP cron 作业来获取已注册我的应用程序的人的最新推文 但我不知道如何用
  • Scip 与 Pyomo 接口的问题

    我正在尝试使用 Pyomo 解决非线性优化问题 首先 我尝试了 Ipopt 求解器 并且运行起来了 然后我想尝试一下求解器Scip由于 Ipopt 是局部求解器 因此尝试进行全局优化 但是 我在使用它时遇到了我无法理解的错误 让 Scip
  • SSIS 包将不再在 Visual Basic 中执行 - 而是通过“构建”

    我是一个超级初学者 使用 Visual Studio 2017 创建我的第一个 SSIS 包 此包打开一个平面文件 csv 并将其添加到 SQL 服务器上的表中 当我按下 开始 按钮 在 Visual Studio 中 时 SSIS 包可以
  • 相对位置的顶部未按预期工作

    为什么 top 属性不起作用 img 当标签 img 是兄弟姐妹 p 但是如果我删除标签 p p 这有效 html body height 100 img position relative top 40 p p Lorem ipsum d
  • 以编程方式将 ipython 笔记本保存为脚本

    优秀的ipython笔记本有一个方便的 script命令行标志自动将笔记本的副本保存为 py脚本文件 删除任何标题和 Markdown 单元格 有没有办法在笔记本打开后从笔记本内部打开此功能 显然 此选项无法访问 config magic
  • 使用jna消费按键事件

    在我正在编写的应用程序之一中 我需要使用某些关键事件 以便其他应用程序不处理它们 在我的代码中 我创建了一个 com sun jna platform win32 WinUser LowLevelKeyboardProc 如下所示 impo