当前位置: 首页 > 知识库问答 >
问题:

Windows上Java中的全局热键问题

乐正烨熠
2023-03-14

我需要全局热键支持我的Java应用程序。

我想出了一些代码(大部分是复制的),但它不起作用。

HotkeyManager.java:

import java.awt.event.KeyEvent;

public class HotkeyManager extends Thread {
    public static void register() {
        User32.RegisterHotKey(null, 1, 0x000, KeyEvent.VK_F);
        new HotkeyManager().start();
    }

    public HotkeyManager() {

    }

    @Override
    public void run() {
        MSG msg = new MSG();
        while (true) {
              while (User32.PeekMessage(msg, null, 0, 0, User32.PM_REMOVE)) {
                   if (msg.message == User32.WM_HOTKEY) {
                       System.out.println("Hotkey pressed with id: " + msg.wParam);
                   }
              }

              try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

用户32。爪哇:

import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import com.sun.jna.Pointer;
import com.sun.jna.win32.W32APIOptions;

public class User32 {
    static {
        Native.register(NativeLibrary.getInstance("user32", W32APIOptions.DEFAULT_OPTIONS));
    }

    public static final int MOD_ALT = 0x0001;
    public static final int MOD_CONTROL = 0x0002;
    public static final int MOD_SHIFT = 0x0004;
    public static final int MOD_WIN = 0x0008;
    public static final int WM_HOTKEY = 0x0312;
    public static final int PM_REMOVE = 0x0001;

    public static native boolean RegisterHotKey(Pointer hWnd, int id, int fsModifiers, int vk);
    public static native boolean UnregisterHotKey(Pointer hWnd, int id);
    public static native boolean PeekMessage(MSG lpMsg, Pointer hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg);

}

msg. java:

import java.util.Arrays;
import java.util.List;

import com.sun.jna.Pointer;
import com.sun.jna.Structure;

public class MSG extends Structure {
    public Pointer hWnd;
    public int lParam;
    public int message;
    public int time;
    public int wParam;
    public int x;
    public int y;

    @Override
    protected List getFieldOrder() {
        return Arrays.asList(new String[]{"hWnd", "lParam", "message", "time", "wParam", "x", "y"});
    }
}

它确实注册了热键(当程序运行时,按系统中的“F”键不会产生任何结果),但我从未得到任何到控制台的输出。发生了什么?我也知道jintellitype和jnativehook。我不能使用first,至于second,它总是监听所有硬件事件,包括鼠标移动和所有按键,我只会将其用作最后手段。

共有1个答案

宋耀
2023-03-14

我猜到了。我必须在监听消息的同一个线程中注册热键。用户32。RegisterHotKey(null,1,0x000,KeyEvent.VK_F);进入run(),一切正常。

 类似资料:
  • 问题内容: Java6应用程序位于系统托盘中。需要使用热键(例如,Super-G或Ctrl-Shift-L等)将其激活,并执行某些操作(例如,显示输入框)。 我该怎么做: 问题答案: 我已经使用JNA在Java中为全局热键编译了一个库。目前,它支持Windows,Linux和Mac OSX。它还支持Windows和Linux上的媒体密钥。 如果有人感兴趣,请尝试https://github.com

  • 问题内容: 就像Ctl,Alt +删除一样 我想编写一个程序,该程序在python中使用带有3个或更多参数的全局热键。仅当我按下键盘上的所有三个键时,分配的功能才应执行。例如alt,windows和F3。 这是我要运行的当前程序,但是其输出是: 该程序: 正在注册3个热键?可能? 说明如何使用一种方法,分配一个需要按下的键,然后分配是否需要按下两个键。但是我不会说该功能仅在同时按下所有功能时才执行

  • 本文向大家介绍C#全局热键设置与窗体热键设置实例,包括了C#全局热键设置与窗体热键设置实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#全局热键设置与窗体热键设置,分享给大家供大家参考。具体实现方法如下: 1、窗体热键 首先要设置主窗体KeyPreview为true,可直接在属性中进行设置, 或者在窗体加载中设置: this.KeyPreview = true; 然后添加窗体KeyD

  • 问题内容: 我不确定100%,但是我相信我是从家用计算机和办公室PC上的Windows安装程序安装了节点v5。 在我的家用PC上,全局安装发生在%APPDATA%下: 在我的办公室PC上,它们位于程序文件下: 我需要为PyCharm的文件监视程序提供许多这些全局工具的完整路径,并且由于我共享的项目文件很有意义,因此在用户文件夹下没有全局资源。 为什么全局安装最终会位于不同的文件夹中,我如何将它们强

  • 问题内容: 我必须接一个热键(意思是,按,仅释放,然后再按一次)。这是我想做的事情: 我的想法是,一旦按下,就必须再次注册相同的热键并捕获它。我要安排一个计时器,因为第二次按下应该很快。但是我认为我走错了路,因为这会使事情变得非常复杂。 你的想法?PS那里没有窗口,它捕获了 全局 热键。我还尝试了Internet上的很多东西,但是它并没有按我想要的那样工作,因此在向我提供任何代码之前,请对其进行测

  • 问题内容: 我根本找不到npm存储其全局设置的位置。 npm config获取userconfig npm config获取globalconfig 这些路径中都没有文件,但是 npm config get proxy->返回我的代理URL。我要删除。 npm config -g删除代理 问题答案: 似乎该文件用于编辑其配置文件不是在全新安装中创建的,因为每个文件都有一个默认选项。这就是为什么您仍