On windows I want to get the code I see in language bar on windows. I need to get this current keyboard layout at any given time.
If I use this in a thread:
InputContext is = InputContext.getInstance();
System.out.println(is.getLocale());
I'll get layout that was active when the program was started. But when i press either win+spacebar or alt+shift and change layout to something else, the thread will keep outputting previous language.
I didn't find any parameter that would reflex on keyboard layout in system properties either.
Thread example:
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();
AFAIK you will have to write some JNI to get it. There are 2 functions of interest in Windows API :
GetKeyboardLayout : will give a DWORD whose lower word identifies language and sublanguage -> to use if you just switch between a limited an known list of layoutsGetKeyboardLayoutName : will (almost) directly give you a null terminated string - extract from documentation :
Syntax
BOOL GetKeyboardLayoutName(LPTSTR pwszKLID);
Parameters
pwszKLID
[out] Pointer to the buffer (of at least KL_NAMELENGTH characters in length) that receives the name of the input locale identifier, including the terminating null character ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With