GetAsyncKeyState и VirtualKeys / специальные символы с использованием JNA (JAVA)

Я работаю над двусторонним приватным чатом, который будет работать в полноэкранном режиме игра.

Это необходимо для того, чтобы пользователь мог вводить текст в полупрозрачное текстовое поле в верхней части экрана , даже если оно не имеет фокуса .

Используя следующий код, Я могу обнаружить ВСЕ физические ключи , но испытываю трудности с виртуальными ключами.

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 на «£», но это не будет работать с другими клавиатурами.

11
задан David 5 October 2011 в 10:35
поделиться