如何获取全局当前的键盘状态? (即当前按下哪些键,无论查询应用程序是否具有焦点)

2023-12-13

我正在编写一个屏幕捕获实用程序,我希望能够在截取屏幕截图时存储键盘和鼠标的当前状态。

对鼠标执行此操作很简单,因为使用指针信息类中描述的方式相关问题为您提供当前鼠标位置的屏幕坐标以及单击信息(如果需要)。然而,我还没有找到类似的键盘类;所有与键盘相关的类似乎都是特定于焦点的。

那么,Java中有没有办法获取当前键盘状态呢?

附:请记住,我正在寻找一个函数来调用以检索有关按下哪些键的信息,not此类抑郁事件的听众。


你可以做的就是实施KeyListener界面并为您感兴趣的所有按键提供状态。

例如,如果您有兴趣检查屏幕截图上是否按下了箭头键,您可以实现此KeyListener接口和覆盖keyPressed() and keyReleased()方法并设置您感兴趣的那些键的状态keyPressed or keyReleased。取决于事件。这样,当屏幕截图发生时,您可以读取这些按键的状态

如果您需要此解决方案是全局的,无论应用程序焦点如何,您可以用 C 编写一个小钩子,可以与 Java 本机接口集成以侦听关键事件。 Java 不允许您在未将侦听器附加到组件并且该组件具有焦点的情况下侦听关键事件。看一下JNativeHook.

如果您只是在应用程序具有焦点但在每个组件上时需要它,您可以不优雅地将侦听器附加到所有组件,或者您可以编写自己的自定义 KeyEventDispatcher 并将其注册到 KeyBoardFocusManager 上。这样,只要您的应用程序具有焦点,无论具有特定焦点的组件如何,您都可以捕获所有键盘事件。看:

public class YourFrame extends JFrame {    

    public YourFrame() {
        // Finish all your layout and add your components
        //

        // Get the KeyboardFocusManager and register your custom dispatcher
        KeyboardFocusManager m = KeyboardFocusManager.getCurrentKeyboardFocusManager();

        m.addKeyEventDispatcher(new YourDispatcher());
    }

    private class YourDispatcher implements KeyEventDispatcher {
        @Override
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getID() == KeyEvent.KEY_TYPED) {
                // Do something to change the state of the key
            } else if (e.getID() == KeyEvent.KEY_PRESSED) {
                // Do something else
            }
            return false;
        }
    }

    public static void main(String[] args) {
        YourFrame yF = new YourFrame();
        yF.pack();
        yF.setVisible(true);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取全局当前的键盘状态? (即当前按下哪些键,无论查询应用程序是否具有焦点) 的相关文章

  • “JSONArray 文本必须在 null 的第 1 个字符处以 '[' 开头”

    只是想知道这个错误可能意味着什么 我从下面的代码中得到它 try JSONArray jArray new JSONArray result for int i 0 i
  • 如何在ArrayList中的特定位置插入对象

    假设我有一个大小为 n 的对象的 ArrayList 现在我想在特定位置插入另一个对象 假设在索引位置 k 大于 0 且小于 n 并且我希望索引位置 k 处及其之后的其他对象向前移动一个索引位置 那么有没有什么方法可以直接在Java中做到这
  • 如何从 Java 访问 Windows 设备管理器中的信息?

    我有一个串行 USB 设备 并且其中多个设备可以连接到计算机 我需要查询和检索设备连接到的 COM 端口列表 在 Windows 设备管理器中 您可以获得当前连接的设备的 COM 端口 友好名称 该列表是动态的 从注册表中读取不工作 htt
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • 使用 Jena 查询维基数据

    目前 Wikidata 有一个 SPARQL 端点 https query wikidata org https query wikidata org 我想使用 Jena 3 0 1 查询此网站 我使用以下代码 但收到错误消息 端点返回的
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 如何让“循环”泛型在 Java 中工作?

    我在编译以下涉及一些泛型的代码时遇到错误 public abstract class State
  • 避免 @Secured 注释的重复值

    我正在尝试使用以下方法来保护我的服务方法 Secured如下 public interface IUserService Secured ROLE ROLE1 ROLE ROLE2 ResponseEntity saveUser Creat
  • Time.valueOf 方法返回错误值

    我使用 Time valueOf 方法将字符串 09 00 00 转换为 Time 对象 如下所示 Time valueOf LocalTime parse 09 00 00 当我调用 getTime 来显示我得到的值时 28800000
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • 获取 Future 对象的进度的能力

    参考 java util concurrent 包和 Future 接口 我注意到 除非我弄错了 只有 SwingWorker 实现类才能启动冗长的任务并能够查询进度 这就引出了以下问题 有没有办法在非 GUI 非 Swing 应用程序 映
  • Spring - 如何在不匹配列名的情况下使用 BeanPropertyRowMapper

    我正在开发一个应用程序 该应用程序已使用行映射器从纯 JDBC 转换为 Spring 模板 我遇到的问题是数据库中的列与属性名称不匹配 这阻止我使用BeanPropertyRowMapper容易地 我看到一些关于在查询中使用别名的帖子 这会
  • java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

    文件夹结构 app main java jni Android mk Application mk hello jni c res 在构建 gradle apply plugin com android application androi
  • 如何使用eclipse调试JSP tomcat服务?

    我想使用 Eclipse IDE 调试器来调试单独运行的 JSP Struts Tomcat Hibernate 应用程序堆栈 如何设置 java JVM 和 eclipse 以便设置断点 监视变量值并查看当前正在执行的代码 我刚刚用谷歌搜
  • 使用 Java 8 Spring 4 + MyBatis 集成问题

    使用 Java 8 1 8 0 60 Spring 4 2 1 和 MyBatis 3 3 0 时遇到以下异常 Sep 29 2015 11 02 58 AM org springframework context annotation A
  • 为什么不能在 if 语句中声明变量?

    以下 Java 代码无法编译 int a 0 if a 1 int b 0 if a 1 b 1 为什么 不能有任何代码路径导致程序将 1 分配给b无需先声明 我突然想到b的变量范围可能仅限于第一个if声明 但后来我不明白为什么 如果我实在
  • 检查按钮是否可用?如果没有,请等待 5 秒钟,然后再次检查?

    基本上我想看看此刻是否可以单击按钮 如果没有我想再试一次 所以我需要某种 goto 函数来返回到代码的前一行 尽管我怀疑我写得非常糟糕 但它本来可以做得更容易 try driver findElement By xpath button i
  • com.sun.xml.ws.message.saaj.SAAJHeader 无法转换为 com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader

    我正在尝试访问第三方 Web 服务 该服务要求我创建一个传递时间信息 用户名和密码的安全标头 我在网上搜索了可行的示例 并尝试了多种方法 我正在尝试使用 Java 6 中内置的内容来做到这一点 我不确定我做错了什么 从 WSDL 生成 We

随机推荐

  • 跨多个用户共享 BigQuery 的缓存

    据我了解 BigQuery 的caching机制是基于每个用户的 但我们希望能够在项目 数据集 表级别上共享缓存 例如 约翰和玛丽都在同一个 Google 项目上工作XYZ 他们喜欢使用 BigQuery 并且都查询表Bar在数据集中Foo
  • 我的rec函数是尾递归的吗?

    这个函数是尾递归的吗 let rec rec algo1 step J if step dSs then J else let a Array init Array2D length1 M fun i gt minby1J i M J le
  • 根据所需长度分割字符串

    有没有一种简单的方法可以根据所需的长度分割字符串 例如 我有一个字符串
  • 如何在主容器中注册类型,但在子容器中解析?

    我有一个统一容器并使用RegisterType使用以下方法注册以下存储库和实现者ContainerControlledLifetimeManager public interface IPersonRepository Person Get
  • 将 C++ string/wchar_t* 转换为 C# 字符串?

    问题 我需要从 C 可执行文件调用 C dll 我使用 COM 它对于 int long 和 bool 工作得很好 但我连一根绳子都拉不起来 IDL 文件说它是一个 BSTR 但我无法正确传递它 也无法检索它 我尝试像使用 VB6 一样使用
  • C++ 中的映射可以接受任何类型的值

    我想在 c 中创建一个可以接受任何类型值的映射 我在 java 中使用 Object 类做了同样的事情 映射但不知道如何在 C 中执行此操作 请帮忙 正如前面的答案正确建议的那样 您不能在 C 中开箱即用 我假设通过 可以接受任何类型的值
  • 由于环境错误而无法安装软件包:[Errno 13]

    在我的 MacOS Mojave 终端中 我想使用 pip 安装 python 包 最后它说 You are using pip version 10 0 1 however version 18 1 is available You sh
  • TypeError:“pygame.Surface”对象不可调用并且 pygame 窗口崩溃

    我对 Pygame 和 Python 很陌生 我刚刚编写了第一个代码 但不知何故我不断收到此错误 TypeError pygame Surface object is not callable 我不知道代码是否有问题 或者只是因为Pygam
  • string_split的结果顺序?

    现在我发现这很棒string split 函数 然后我了解到输出行可以按任意顺序排列 不保证顺序与输入字符串中子字符串的顺序匹配 这使得该功能对我来说毫无用处 也许有解决方法吗 EDIT 例子 SELECT value FROM Strin
  • 当子查询格式错误时,T-SQL 删除表中的所有行[重复]

    这个问题在这里已经有答案了 可能的重复 sql server 2008 Management Studio 不检查我的查询的语法 我今天遇到一个问题 子查询很糟糕 结果是父表中的所有行都被删除 TableA ID Text GUID Tab
  • sed多行替换问题

    我遇到了 sed 替换问题 希望你们中的一位能够帮助我 我确信我错过了一些简单的事情 所以我有一个包含文本和引用的文件 引用本身可以在一行上 也可以跨多行 我希望引用内容单独占一行 作为示例 这里是文件的示例 And he said Thi
  • 发布为 Azure WebJob 在 VS 2013 中不起作用

    我正在尝试使用 Visual Studio 2013 发布一个 Azure 网站以及一些 azure webjobs 我正在关注本教程 我的解决方案具有以下结构 当我尝试将现有项目作为 Web 作业添加到我的 Web 项目中时 我在 项目名
  • 如何清理 Massscan 输出 (-oL)

    我对带有 oL 选项的 Masscan 实用程序生成的输出有疑问 grep able 输出 例如 它输出 Host 143 137 155 7 Ports 80 open tcp Host 177 105 21 41 Ports 8080
  • where_in 和 find_in_set 之间的区别

    我正在处理一个联接查询 其中我必须从包含逗号分隔值的列中获取数据 allowed activity包含1 2 3 4 5 6这就是activity id这是允许的 因此 在查询中 我正在检查当前活动是否允许 为此 我使用了where in并
  • 向 WiX 注册 COM 服务器

    我一直在尝试确定使用 WiX 注册 COM 服务器以创建 Windows Installer 包的最佳解决方案 但我正在努力 在这篇文章中部署工程存档 HOWTO 将 Regsvr32 exe 与 WIX 结合使用 有公开请求 安装警察 通
  • 引起原因:java.sql.SQLException: ORA-01795: 列表中表达式的最大数量为 1000?

    我正在使用 java hibernate Oracle 我有一个包含 3000 多个条目的列表 如果我通过了整个列表 我会得到以下异常 引起原因 java sql SQLException ORA 01795 列表中表达式的最大数量为 10
  • 为什么使用 python 的 GPS 输出为零或 Nan?

    我在 GPS 输出方面遇到问题 当我输入 cat dev ttyUSB0 我有 NMEA 句子出来 这就是我想要的 GPGGA 134131 000 4548 0018 N 01557 1026 E 1 06 1 5 123 8 M 42
  • Class.forName() 是如何工作的?

    我刚刚了解到java sql package 它用Class forName 动态加载扩展的驱动程序DriverManager 然后我们使用DriverManager getConnection method 那么整个事情是如何运作的呢 D
  • PHP非原始类数组作为函数参数

    我想知道 如果可能的话 如何将非原始类数组声明为函数参数 例如
  • 如何获取全局当前的键盘状态? (即当前按下哪些键,无论查询应用程序是否具有焦点)

    我正在编写一个屏幕捕获实用程序 我希望能够在截取屏幕截图时存储键盘和鼠标的当前状态 对鼠标执行此操作很简单 因为使用指针信息类中描述的方式相关问题为您提供当前鼠标位置的屏幕坐标以及单击信息 如果需要 然而 我还没有找到类似的键盘类 所有与键