Как определить, требует ли символ нажатия клавиши Shift для набора текста?

StackOverflow https://stackoverflow.com/questions/1101625

  •  12-09-2019
  •  | 
  •  

Вопрос

Я пишу код для ввода строк с использованием класса Robot.В основном все хорошо (ну, мне приходится использовать большой оператор переключения, чтобы получить коды символов), за исключением того, что у некоторых клавиш нет кодов клавиш, потому что на самом деле они представляют собой комбинацию Сдвиг + еще какой-то ключ.Прописные буквы легко проверить, используя Character.isUpperCase(c), но для всех символов, таких как !@#$%^&*()_+ и различные знаки препинания не считаются «заглавными», хотя для генерации нажатия клавиши они требуют нажатия клавиши Shift.Я попробовал поискать в Google, но нашел сообщение на форуме без удовлетворительных ответов.Есть ли способ определить, нужно ли нажимать символу сдвиг, и если да, то какой символ является «несмещенной» версией?

РЕДАКТИРОВАТЬ:Вот код, который у меня есть на данный момент.

public void GenerateKeyTyped(char c) {
    if (Character.isUpperCase(c)) {
        r.keyPress(KeyEvent.VK_SHIFT);
    }
    r.keyPress(GetKeyCode(c));
    r.keyRelease(GetKeyCode(c));
    if (Character.isUpperCase(c)) {
        r.keyRelease(KeyEvent.VK_SHIFT);
    }
}
Это было полезно?

Решение

Я не знаю, как напрямую решить вашу проблему (я только что использовал карту для этих персонажей), но это может дать вам некоторые идеи:

import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Main3 {

    public static void main(String[] args) {
        try {
            Robot robot = new Robot();

            HashMap<String, String> map = new HashMap<String, String>();
            map.put("!", "1");
            map.put("@", "2");
            map.put("#", "3");

            char[] charz = "abcdefgABCDEFG123!#".toCharArray();

            for(int i = 0; i < charz.length; i++)
            {
                System.out.print(charz[i] + " : ");
                boolean shiftRequired = false;
                String key = String.valueOf(charz[i]);
                String value = map.get(key);

                if (value != null)
                {
                    shiftRequired = true;
                    key = value;
                }
                else if (Character.isUpperCase(key.charAt(0)))
                {
                    shiftRequired = true;
                }
                else
                {
                    key = key.toUpperCase();
                }

                KeyStroke ks = KeyStroke.getKeyStroke("pressed " + key.toUpperCase());

                int keyCode = ks.getKeyCode();
                System.out.println(keyCode);

                if (shiftRequired)
                    robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT);

                robot.keyPress( keyCode );
                robot.keyRelease( keyCode );

                if (shiftRequired)
                    robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT);
            }


        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

Другие советы

Я не уверен, возможно ли то, что вы ищете.Вы можете создать свою собственную таблицу, но имейте в виду, что тогда она будет работать только для одной раскладки клавиатуры (во многих языках есть свои собственные раскладки клавиатуры, которые больше подходят для их конкретных наборов символов, а также есть раскладка Дворжака, которая, вероятно, имеет такую ​​раскладку). собственные сдвинутые и несмещенные клавиши), если только вы не примете во внимание все раскладки клавиатуры, которые хотите поддерживать, и не создадите для них собственные таблицы.

Можно ли использовать классы AWT? Нечто подобное может работать:

AWTKeyStroke ks = AWTKeyStroke.getAWTKeyStroke('!');
int modifers = ks.getModifiers();

if ((modifiers & KeyEvent.VK_SHIFT) == KeyEvent.VK_SHIFT) {
    // Shift pressed
}

Если вы посмотрите на Таблица ASCII эти символьные клавиши расположены в диапазоне 0x21 - 0x2B
Вероятно, вы можете посмотреть таблицу ASCII, чтобы распознать все остальные символы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top