Получить текущую раскладку Windows в Java

На окнах я хочу получить код, который я вижу в языковой панели на окнах. Мне нужно получить эту текущую раскладку клавиатуры в любой момент времени.

Если я использую это в потоке:

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

Я получу макет, который был активен при запуске программы. Но когда я нажимаю либо win + пробел, либо 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();

2 ответа

Решение

AFAIK вам придется написать JNI, чтобы получить его. В Windows API есть две интересующие функции:

  • GetKeyboardLayout: выдаст DWORD, чье нижнее слово идентифицирует язык и подъязык -> использовать, если вы просто переключаетесь между ограниченным известным списком раскладок
  • GetKeyboardLayoutName: будет (почти) напрямую давать вам строку с нулевым символом в конце - извлечение из документации:

    Синтаксис

    BOOL GetKeyboardLayoutName(LPTSTR pwszKLID);
    

    параметры

pwszKLID[out] Указатель на буфер (как минимум KL_NAMELENGTH символов), который получает имя идентификатора входного языкового стандарта, включая завершающий нулевой символ...

Вы можете использовать JNA для этого:

      import com.sun.jna.platform.win32.User32
import com.sun.jna.platform.win32.WinDef

val layout: WinDef.HKL = User32.INSTANCE.GetKeyboardLayout(0)

Грейдл:

       implementation("net.java.dev.jna:jna-platform:5.12.1")
Другие вопросы по тегам