密钥发送操作中的西里尔字母的密钥/编码问题

问题描述

我面临一个非常罕见的问题,即使经过数小时的搜索,我也无法解决自己。

我使用node-key-sender(但问题与其他类似的模块,例如robots.js相似)用于键盘发射(键​​盘按钮发送操作)

当我使用任何英语单词时,以下功能都可以正常工作:

const ks = require('node-key-sender');

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve,ms));
}

(async function query (query = 'Bread') {
    try {
        query = query.toLowerCase()
        await sleep(1000)
        ks.sendText(query); //prints bread in real time after 1 second delay
    } catch (e) {
        console.error(e)
    }
})();

但是当我尝试将其用于任何西里尔字母时,它什么都不做,因为它不包含任何«字母映射»,但是如果我添加它,它可以正常工作,但是...

const ks = require('node-key-sender');

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve,ms));
}

const RuMap = {
    "й": 'q',"ц": 'w',"у": 'e',"к": 'r',"е": 't',"н": 'y',"г": 'u',"ш": 'i',"щ": 'o',"з": 'p',"х": 'shift-@55',"ъ": 'close_bracket',"ф": 'a',"ы": 's',"в": 'd',"а": 'f',"п": 'g',"р": 'h',"о": 'j',"л": 'k',"д": 'l',"ж": ';',"э": "'","я": 'z',"ч": 'x',"с": 'c',"м": 'v',"и": 'b',"т": 'n',"ь": 'm',"б": '',"ю": 'slash',};

(async function query (query = 'Хлеб') {
    try {
        query = query.toLowerCase()
        ks.aggregateKeyboardLayout(RuMap);
        await sleep(1000)
        ks.sendText(query); //prints only 'л' and 'е'
    } catch (e) {
        console.error(e)
    }
})();

问题是,如果我要打印任何非英语单词,我应该在操作系统中更改语言键盘,然后运行此功能,因此西里尔字母已转换为英语根据语言布局图,类似Q => Й的对应对象:

enter image description here

示例:

因此,如果我想打印单词ЙЦУКЕН,我应该将每个字母转换为QWERTY,并且由于我的语言布局是,机器打印发出以下键,并打印ЙЦУКЕН。西里尔字母现在在操作系统中。

enter image description here

它工作正常,直到我没有遇到西里尔Х => [问题。开括号有KeyCode @219VK_OPEN_BRACKET (in Java KeyEvent)。但是,即使我添加到布局{ "х": '@219' }{ "х": 'open_bracket' },它也仍然无法正常工作。

据我了解,KeySend会以某种方式更改或与non-ASCI符号问题相关。

因此,在西里尔字母布局中,shift+@55的KeyCode与?有关,但是在英语布局中,?没有keyCode @55,因此,如何查找西里尔文的布局并解决了这个问题?

解决方法

经过字符映射的Unicode Subtrange可以帮助我经过4个小时的编码:

enter image description here

"х": '@18-@96-@98-@100-@101'等于所有字符的Alt+0245,在活动的操作系统布局中没有KeyCode。