键发送操作中西里尔字母的键码/编码问题
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 布局中没有键码。
我遇到了一个非常罕见的问题,即使在谷歌上搜索了几个小时后我也无法解决。
我使用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 forQWERTY
, 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 布局中没有键码。