Я работаю над двухсторонним приватным чатом, который будет работать в полноэкранном режиме.
Это необходимо для того, чтобы пользователь вводил полупрозрачное текстовое поле в верхней части экрана , даже если оно не имеет фокуса.
Используя следующий код, , я могу обнаружить ВСЕ физические клавиши, но с виртуальными клавишами сложное время.
 SHIFT.
 2.
Однако Shift + 2 обнаруживаются как отдельные клавиши (даже если [SHIFT+2] дает @ на моей клавиатуре). IE: программа выводит как SHIFT, так и 2, но не то, что они производят: @.
Проблема в том, как я буду конвертировать в символ в зависимости от клавиатуры? Например:
-  На британской клавиатуре SHIFT + 2 даст мне 
"(кавычки). -  На американской клавиатуре SHIFT +2 даст мне 
@. 
Как я могу преобразовать конкретный символ в зависимости от клавиатуры?
Вот код:
static interface User32 extends Library {
    public static User32 INSTANCE = (User32) Native.loadLibrary("User32", User32.class);
    short GetAsyncKeyState(int key);
    short GetKeyState(int key);
    IntByReference GetKeyboardLayout(int dwLayout);
    int MapVirtualKeyExW (int uCode, int nMapType, IntByReference dwhkl);
    boolean GetKeyboardState(byte[] lpKeyState);
    int ToUnicodeEx(int wVirtKey, int wScanCode, byte[] lpKeyState, char[] pwszBuff, int cchBuff, int wFlags, IntByReference dwhkl);
}
public static void main(String[] args)  {   
    long currTime = System.currentTimeMillis();
    while (System.currentTimeMillis() < currTime + 20000)
    {
        for (int key = 1; key < 256; key++)
            {
                if (isKeyPressed(key)) 
                    getKeyType(key);
            }
    }
}
private static boolean isKeyPressed(int key)
{
    return User32.INSTANCE.GetAsyncKeyState(key) == -32767;
}
private static void getKeyType(int key)
{
    boolean isDownShift = (User32.INSTANCE.GetKeyState(VK_SHIFT) & 0x80) == 0x80;
    boolean isDownCapsLock = (User32.INSTANCE.GetKeyState(VK_CAPS)) != 0;
    byte[] keystate = new byte[256];
    User32.INSTANCE.GetKeyboardState(keystate); 
    IntByReference keyblayoutID = User32.INSTANCE.GetKeyboardLayout(0);
    int ScanCode  = User32.INSTANCE.MapVirtualKeyExW(key, MAPVK_VK_TO_VSC, keyblayoutID);
    char[] buff = new char[10];
    int bufflen = buff.length;
    int ret = User32.INSTANCE.ToUnicodeEx(key, ScanCode, keystate, buff, bufflen, 0, keyblayoutID);
    switch (ret)
    {
        case -1: 
            System.out.println("Error");
        break;
        case 0:  // no translation
        break;
        default: 
        System.out.println("output=" + String.valueOf(buff).substring(0, ret));
    }
}
Он отлично работает и выводит нажатые клавиши, но не работает с комбинациями Shift+. Я понимаю, что я могу сделать "Switch" и сменить Shift + 3 на "E", но это не будет работать с разными клавиатурами.