在 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
个字符)的指针,该缓冲区接收输入区域设置标识符的名称,包括终止空字符 ...
在 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
个字符)的指针,该缓冲区接收输入区域设置标识符的名称,包括终止空字符 ...