Как генерировать события клавиатуры, у которых нет кода клавиши в Java?

Я использую класс Robot и коды клавиш KeyEvent для генерации всех других ключевых событий, и они работают нормально, но мне также нужна клавиша хангыль (переключение корейской клавиатуры). По-видимому, у KeyEvent нет кода для этой клавиши, поэтому я застрял :( Есть ли способ сгенерировать это ключевое событие хангыль? Есть ли способ использовать код клавиши Windows, такой как VK_HANGUL (0x15) вместо KeyEvent коды клавиш?Если бы это было возможно, то изменение всех кодов клавиш не было бы проблемой... Или каким-то образом взять ключевое событие один раз, сохранить его где-то постоянно и использовать навсегда...???

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

Было бы неплохо иметь возможность генерировать событие ключа хангыль, но если это невозможно, есть ли какие-либо предложения о том, как я могу этого добиться? Может быть, я мог бы связать каждую корейскую букву с соответствующим алфавитом на клавиатуре (например, g — это ㅎ на обычных клавиатурах, в которых есть и английский, и корейский языки) или что-то в этом роде, но как мне отправить это в другие приложения?

Извините, если этот вопрос так везде. Я просто действительно потерян.


person Jade    schedule 10.12.2014    source источник
comment
Это может помочь вам. Не помечать как дубликат, поскольку он не выглядит дубликатом (фактический ключ против интерпретации Unicode). stackoverflow.com/questions/397113/ Я не на 100% знаком с Robot или Hangul, поэтому я не уверен, есть ли интерпретируемый Unicode.   -  person Compass    schedule 11.12.2014
comment
Спасибо за комментарий! Использование альтернативного кода, как в вашей ссылке, на самом деле хорошая идея. Однако вам нужно удерживать «Alt», а затем перейти к цифровой клавиатуре и нажать «+» и другие цифры шестнадцатеричного Unicode, верно? Как заставить робота нажимать клавишу NUMPAD «+»? Я пробовал SHIFT=, но это не работает...   -  person Jade    schedule 11.12.2014
comment
stackoverflow.com/questions/15605109/java-keybinding-plus-key Я не очень хорошо разбираюсь в ключевых событиях, но похоже, что это сработает   -  person Compass    schedule 11.12.2014
comment
Кроме того, из-за того, как устроен корейский язык (одна буква обычно представляет собой комбинацию из 2-3 символов, если это имеет смысл, например, 한 — это ㅎ+ㅏ+ㄴ, существуют тысячи комбинаций), сопоставить каждую букву с использованием юникода очень сложно. .   -  person Jade    schedule 11.12.2014
comment
Отсрочка вроде бы ничего не меняет...   -  person Jade    schedule 11.12.2014
comment
Я тогда запутался :(   -  person Compass    schedule 11.12.2014
comment
Спасибо за помощь в любом случае :)   -  person Jade    schedule 11.12.2014


Ответы (1)


Я нашел одно решение проблемы. Я использовал JNA для генерации события клавиатуры.

Вот несколько кодов, вдруг кому понадобится.

Базовые вещи для использования метода JNA и keybd_event из User32.dll:

import com.sun.jna.*;    
import com.sun.jna.Native;    
import com.sun.jna.platform.win32.User32;
import com.sun.jna.win32.StdCallLibrary;    
public interface User32jna extends User32 {
 User32jna INSTANCE = (User32jna) Native.loadLibrary("user32.dll",User32jna.class);
 public void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
}
User32jna u32 = User32jna.INSTANCE;

А затем вставьте это туда, где вам нужно сгенерировать ключевое событие:

u32.keybd_event((byte) 0x15,(byte)0xF2,0,0);

0x15 и 0xF2 — это код виртуальной клавиши и код сканирования клавиатуры для клавиши переключения хангыль/английский, которые я искал, но найдите коды для любой клавиши, которая вам нужна, а затем замените их, и вы сможете сгенерировать практически любое событие клавиши.

Для этого вам понадобятся jna.jar и platform.jar.

person Jade    schedule 12.12.2014
comment
использование JNA для этого типа задач, скорее всего, сломает вашу функциональность в какой-то момент в будущем. В настоящее время WINAPI быстро меняется, жесткое связывание вашего байт-кода с машинным кодом требует постоянного тестирования на всех ваших целевых платформах - и в какой-то момент даже его переписывания с постоянными примитивами (такими, которые вы используете) это может работать немного дольше, так как Microsoft не часто меняет константы, но это БУДЕТ происходить, поэтому они ввели для них собственные макросы, они всегда будут отображаться на правильный примитив. - person specializt; 12.12.2014
comment
Да, это соответствует тому, что меня беспокоило сначала, поэтому я написал «одно» решение вместо «решения». В конце концов я решил, что в моем случае это не будет иметь значения, так как это всего лишь семестровый проект. Однако не могли бы вы рассказать мне больше о нативных макросах? Я не знал, что они существуют. Какие ключевые слова я должен искать, чтобы получить информацию о них? - person Jade; 13.12.2014
comment
@специалист Спасибо! - person Jade; 13.12.2014