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

Keycode / encoding problem for cyrrilic letters in key send operations

我遇到了一个非常罕见的问题,即使在谷歌上搜索了几个小时后我也无法解决。

我使用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)
    }
})();

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

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)
    }
})();

问题是,如果我想打印任何非英语单词,我应该在 OS 和 运行 中更改 语言键盘 这个函数,所以西里尔字母已经被转换成对应的英文,如Q => Й,根据语言布局图:

示例:

So, if I want to print the word ЙЦУКЕН I should convert every letter for QWERTY, and machine prints emit the following key, and prints ЙЦУКЕН, because my language layout is Cyrillic right now in the OS.

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

据我所知,KeySend 发生了某种变化,或者它确实与 non-ASCI 符号问题相关。

所以在西里尔布局中,shift+@55 KeyCode 与 ? 相关,但在英文布局中 ? 没有 keyCode @55 所以,如何找到Cyrillic 布局的 KeyCodes 并解决这个问题?

经过 4 小时的编码后,带有字符映射的 Unicode Subrange 帮助我解决了问题:

"х": '@18-@96-@98-@100-@101' 等于所有字符的 Alt+0245,在活动 OS 布局中没有键码。