1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/chaofan2685_admin-quick_search

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 02:28 7835866

Быстрый поиск

Проект введения

Глобальный поиск по ключевым словам, может быть реализован на ПК в любом интерфейсе (почти) после выбора китайских иероглифов, а затем с помощью сочетания клавиш быстрого поиска этих символов.

Архитектура программного обеспечения

Spring Boot

Идея программного обеспечения

Прежде всего, давайте уточним мои требования. Когда я просматриваю что-либо и выбираю некоторые символы, я могу немедленно выполнить поиск этих символов с помощью сочетания клавиш (Ctrl+Shift+Q).

Сначала рассмотрим Java-программу. В Java есть только один контроллер, который используется для получения запросов. После получения запроса он извлекает содержимое из буфера обмена системы и объединяет его в одну команду cmd. Эта команда в основном предназначена для запуска браузера для доступа к хорошо сформированной поисковой ссылке (в настоящее время поддерживается только Baidu, и будет добавлено несколько вариантов позже), что реализует функцию поиска.

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//извлекаем данные из буфера обмена
Transferable content = clipboard.getContents(null);
//определяем, является ли это текстовым типом
if (content.isDataFlavorSupported(DataFlavor.stringFlavor)) {
	//получаем текстовое значение из данных
	String text = (String) content.getTransferData(DataFlavor.stringFlavor);
    if (text == null) {
        return;
    }
    //объединяем одну команду cmd
    String url = "rundll32 url.dll,FileProtocolHandler https://www.baidu.com/s?wd=";
    //выполняем команду cmd
    Runtime.getRuntime().exec(url+text);
}

Как гарантировать, что содержимое буфера обмена является текстом, выбранным при просмотре, и как инициировать этот запрос? Я использую пакетный файл (search.bat), и команда в этом файле - отправить запрос (curl localhost:18088). Затем создайте ярлык для этого командного файла на рабочем столе. Щелкните правой кнопкой мыши ярлык и выберите «Свойства». Установите сочетание клавиш Ctrl+Shift+Q, а также измените режим запуска на минимизированный (так что он не будет всплывать при запуске и будет более удобным в использовании).

Теперь, когда вы выбираете текст и нажимаете эту комбинацию клавиш, система отправляет запрос контроллеру через команду cmd. Однако текст, который мы выбрали, все еще не скопирован! Если вы не боитесь неприятностей, вы можете сначала скопировать выбранный текст с помощью Ctrl+C, а затем нажать Ctrl+Shift+Q. Однако это явно недостаточно элегантно.

Поэтому я подумал о другом способе. Пусть Java-программа имитирует операцию Ctrl+C после того, как запрос достигнет контроллера. Таким образом, текст, который вы выбрали, будет скопирован, а затем будут выполнены операции «взять» и «найти». Это звучит очень хорошо.

Robot robot = new Robot();
//имитируем Ctrl+C, копируем текст
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.delay(100);//обязательно

Однако, когда я применил его на практике, возникли проблемы. Когда вы выбираете китайские иероглифы и нажимаете комбинацию клавиш, система запускает окно cmd, хотя оно минимизировано, оно настолько маленькое, что вы даже не заметите его, но окно, в котором вы выбрали китайские иероглифы, все равно перемещается на задний план. Даже если вы используете Ctrl+C, вы не сможете скопировать эти символы. Я долго думал и придумал хитрый трюк. Мы выполняем Alt+Tab перед Ctrl+C. Таким образом, это работает! Конечно, текст был успешно скопирован.

Robot robot = new Robot();
//имитация Alt+Tab, переключение на предыдущее окно, то есть окно с выбранными китайскими иероглифами
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_ALT);
robot.delay(100);//обязательно

//имитировать Ctrl+C, копировать текст
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyView.C);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.delay(100);//обязательно

Я думал, что работа выполнена, но она не заняла и двух минут, прежде чем возникла фатальная ошибка. После того, как вы выберете китайские иероглифы и нажмёте комбинацию клавиш, если вы поднимете руку медленно или вообще не поднимете её, запрос достигнет контроллера и немедленно выполнит Alt+Tab. Это приводит к конфликту клавиш с последующим Ctrl+C, поэтому текст, который вы хотите скопировать, снова не копируется. Эта ошибка озадачила меня надолго, пока я не смог её решить после работы. Я думал о добавлении цикла «while» в код, чтобы определить, была ли нажата клавиша, пока не перестанет обнаруживаться нажатие клавиши, а затем выполнить последующие действия. Идея была прекрасной, но реализация оказалась непростой, потому что я мало знаю о C/S архитектуре Java и не умею использовать события клавиатуры. Кроме того, кажется, что это событие должно быть привязано к JFrame (если здесь что-то не так, пожалуйста, укажите, спасибо). Я не могу создать новый JFrame, чтобы реализовать эту простую функцию. Это никуда не ведёт.

Конечно, есть ещё одно простое, но несовершенное решение — подождать секунду после входа в контроллер, используя Thread.sleep(1000), чтобы дать пользователю возможность поднять руку. Но пользователь говорит: «Я не поднимаю руку, что ты можешь сделать?» Тогда всё кончено. Более того, ожидание операции также может привести к снижению опыта пользователя и вызвать ощущение замедленной реакции. Это совершенно не соответствует моему стремлению к совершенству и слишком неэлегантно.

Наконец, я нашёл способ решения этой проблемы. Перед выполнением Alt+Tab мы имитируем событие отпускания клавиш Ctrl, Shift и Alt, чтобы предотвратить конфликт клавиш. Даже если ваши пальцы всё ещё находятся на клавиатуре, эти три клавиши больше не работают. Затем вы можете делать всё, что захотите.

Robot robot = new Robot();
//имитируем отпускание клавиш Ctrl, Shift и Alt, чтобы предотвратить конфликт клавиш
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.keyRelease(KeyEvent.VK_ALT);
robot.delay(100);//обязательно

//имитация Alt+Tab, переключение на предыдущее окно, то есть окно с выбранными китайскими иероглифами
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyView.TAB);
robot.keyRelease(KeyEvent.VK_ALT);
robot.delay(100);//обязательно

//имитировать Ctrl+C, копировать текст
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyView.C);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.delay(100);//обязательно

На данный момент основные требования реализованы. Возможно, есть более простой способ реализовать эту, казалось бы, простую функцию, но я, как начинающий программист на Java, могу только временно решить проблему таким образом.

Инструкции по использованию

  1. Рекомендуется создать jar-пакет и скопировать jar-файл и два пакетных файла в папке «file» на локальный компьютер.

  2. Создайте ярлык для search.bat и настройте его, как описано выше.

  3. switch.bat отвечает за запуск и остановку программы. Если jar-файл не запущен, двойной щелчок запустит jar-файл в фоновом режиме. Если он уже запущен, введите соответствующий символ, чтобы закрыть его.

Ярлык search.bat можно разместить только на рабочем столе, иначе настройка сочетания клавиш не вступит в силу. Это связано с тем, что Microsoft не поддерживает размещение ярлыков в других местах. Если у вас есть обсессивно-компульсивное расстройство, вы также можете поместить ярлык в меню «Пуск». Чтобы сделать это, откройте меню «Пуск», выберите любую программу, щёлкните правой кнопкой мыши и выберите «Дополнительные параметры» > «Открыть расположение файла». Затем поместите ярлык на это место и настройте сочетание клавиш. Теоретически, размещение ярлыка здесь также должно работать, но если у вас есть другие методы, вы можете поделиться ими со мной.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/chaofan2685_admin-quick_search.git
git@api.gitlife.ru:oschina-mirror/chaofan2685_admin-quick_search.git
oschina-mirror
chaofan2685_admin-quick_search
chaofan2685_admin-quick_search
master