【问题标题】:listening for key/mouse events监听键/鼠标事件
【发布时间】:2011-09-19 14:17:58
【问题描述】:

是否可以在没有用户选择 gui 的情况下监听键和鼠标事件?我想制作一个在没有 gui 的情况下在后台运行并响应用户交互的程序,例如按下 ctrl-t

【问题讨论】:

标签: java swing keylistener mouselistener


【解决方案1】:

你可能想看看 jnativehook。 Jnativehook 允许您使用 JNA 侦听键盘事件,而无需现有的焦点 GUI。

https://github.com/chrislgarry/Apollo-11 https://github.com/kwhat/jnativehook/blob/2.2/doc/ConsumingEvents.md

示例用法:

        try {
            GlobalScreen.registerNativeHook()
        } catch (NativeHookException ex) {
            System.out.println(ex.message)
        }

        GlobalScreen.addNativeKeyListener(
            new NativeKeyListener() {
                @Override
                public void nativeKeyTyped(NativeKeyEvent nativeEvent) {
                    System.out.println("Pressed " + nativeEvent.keyChar)
                }
            }
        )

【讨论】:

    【解决方案2】:

    窗口管理器将根据其配置跟踪焦点和直接输入。如果您的窗口管理器决定将输入发送到另一个程序,因为它正在强制更改焦点,那么您就不走运了。

    虽然程序没有焦点,但如果它能够获取鼠标和键盘事件,那将是一个重大的安全漏洞。基本上任何不引人注意的小型后台程序都可以监视整个系统,甚至可能在此过程中窃取密码。

    你唯一的希望是在你的窗口管理器中找到一个选项,它可以让你在不改变焦点的情况下最小化程序。当然,无论您键入什么,都只会进入最小化的程序(不会影响系统的其余部分)。

    另一种技术(绝不保证)是让程序检测最小化事件,并在最小化事件处理程序中请求焦点。请注意,这样做可能会(如果我正在编写窗口管理器)取消最小化窗口。

    【讨论】:

    • 好吧,我不认为它是一个安全线程有什么大不了的,因为几乎所有其他计算机语言都具有这种能力。
    • 所有计算机语言都有接收焦点的能力;但是,他们只能在没有焦点时请求焦点。他们不能随便决定窃听其他程序的输入,除非安全模型允许他们这样做(或被破坏)。即使这样,它也不是语言的真正特性,而是操作系统窗口界面的特性。
    • Edwin,大量合法有用的应用程序在后台监听按键。这个有可能。我正在寻找实现这一点的 win32 API 挂钩,当我找到它时我会在这里发回。
    • @MichaelMcHenry 如果有大量合法有用的应用程序需要在后台监听另一个应用程序的输入(并且不是故意的安全漏洞),请花时间发布一个列表。
    • @EdwinBuck 举一个简单的例子,截屏程序/截屏程序,您将其最小化,它们会继续录制窗口。
    猜你喜欢
    • 1970-01-01
    • 2020-02-20
    • 2014-02-21
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2013-09-01
    • 2019-08-22
    相关资源
    最近更新 更多