在 Java 中获取当前 windows 键盘布局

get current windows keyboard layout in Java

在 windows 我想获取我在 windows 的语言栏中看到的代码。我需要随时获取当前的键盘布局。

如果我在线程中使用它:

InputContext is = InputContext.getInstance();
System.out.println(is.getLocale());

我将获取程序启动时处于活动状态的布局。但是当我按下 win+spacebar 或 alt+shift 并将布局更改为其他内容时,线程将继续输出以前的语言。

我也没有在系统属性中找到任何会反映键盘布局的参数。

线程示例:

    Thread t = new Thread() {

        @Override
        public void run() {
            while(true) {
                InputContext is = InputContext.getInstance();
                System.out.println(is.getLocale());

                Properties p = System.getProperties();
                System.out.println(System.getProperty("user.language"));
                try {
                    sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(InputContextTest.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    };

    t.run();

据我所知,您必须编写一些 JNI 才能获得它。 Windows API 中有 2 个有趣的函数:

  • GetKeyboardLayout :将提供一个 DWORD,其低位字标识语言和子语言 -> 如果您只是在有限的已知布局列表之间切换,则使用
  • GetKeyboardLayoutName :将(几乎)直接给你一个以空结尾的字符串——摘自文档:

    语法

    BOOL GetKeyboardLayoutName(LPTSTR pwszKLID);
    

    参数

pwszKLID [out] 指向缓冲区(长度至少 KL_NAMELENGTH 个字符)的指针,该缓冲区接收输入区域设置标识符的名称,包括终止空字符 ...