Издавать сигналы клавиатуры, не зависящие от региона

API Keyboard позволяет платам Arduino, таким как Micro или Leonardo, излучать сигналы USB, имитируя физическую клавиатуру. Однако сигнал, похоже, передает нажатия клавиш, а не символы, а это означает, что машины с настройками разных регионов интерпретируют сигнал USB по-разному. Например, y будет интерпретироваться как z в немецкой ОС, поскольку в раскладке клавиатуры эти клавиши поменяны местами.

Есть ли способ вывести сигнал, который приведет к передаче правильного символа независимо от настроек ОС без каких-либо изменений в машине, к которой подключен Arduino?

, 👍1

Обсуждение

@jsotola AFAIK большинство клавиатур отправляют нажатую физическую клавишу, а не символ, представленный этой клавишей. Однако я слышал о попытках разрешить клавиатуре указывать свою раскладку и не нашел дополнительных ресурсов по этому поводу., @Philipp

сегодня наткнулся на это........ https://github.com/NicoHood/HID/blob/master/src/HID-Settings.h, @jsotola


2 ответа


3

Нет. Такой возможности нет.

Если вы возьмете немецкую клавиатуру и подключите ее к компьютеру, настроенному для США, раскладка клавиш будет неправильной. Вы должны сообщить компьютеру, что используете немецкую клавиатуру.

Клавиатуры не знают, что напечатано на колпачках клавиш. Они понимают только то, где физически расположены кнопки.

То же самое и с Arduino. Он отправляет нажатия клавиш, соответствующие раскладке американской клавиатуры, и вам нужно сообщить компьютеру, что вы используете американскую клавиатуру, потому что это именно то, что вы используете.

Если вы хотите изменить раскладку клавиатуры, которую использует Arduino, вам придется вручную изменить библиотеку клавиатуры (файл Keyboard.cpp, массив _asciimap[128]).

,

3

Загрузить Определение класса устройства для устройств пользовательского интерфейса (HID)

https://www.usb.org/sites/default/files/documents/hid1_11 .pdf

См. раздел 6.2.1. Дескриптор HID

bCountryCode 0x09 немецкий

см. также раздел E.4 (стр. 67)

E.4 HID Descriptor (Keyboard)
Part            Offset/Size  Description                                         Sample
                (Bytes)                                                          Value
----------------------------------------------------------------------------------------
bLength           0/1        Size of this descriptor in bytes.                    0x09
bDescriptorType   1/1        HID descriptor type (assigned by USB).               0x21
bcdHID            2/2        HID Class Specification release number
                             in binarycoded decimal—for example, 2.10 is 0x210).  0x101
bCountryCode      4/1        Hardware target country.                             0x00
bNumDescriptors   5/1        Number of HID class descriptors to follow.           0x01
bDescriptorType   6/1        Report descriptor type.                              0x22
wDescriptorLength 7/2        Total length of Report descriptor.                   0x3F
,

Это поле игнорируется всеми операционными системами. Его планировали использовать, но никто этого не делает. Производители клавиатур не хотели создавать отдельные контроллеры для каждого языка клавиатуры — гораздо дешевле просто иметь один и менять то, что напечатано на клавиатуре. Кроме того, я не знаю ни одной операционной системы, которая могла бы применять раскладки клавиш к отдельным вводам — она устанавливается только для пользовательского сеанса в целом. Все входные данные сначала объединяются, а затем впоследствии преобразуются из кодов клавиш в символы., @Majenko