Получить текущую раскладку 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")