Я работаю над двухсторонним приватным чатом, который будет работать в полноэкранном режиме.
Это необходимо для того, чтобы пользователь вводил полупрозрачное текстовое поле в верхней части экрана , даже если оно не имеет фокуса.
Используя следующий код, , я могу обнаружить ВСЕ физические клавиши, но с виртуальными клавишами сложное время.
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", но это не будет работать с разными клавиатурами.