Нажатие клавиш в Windows
Я хочу эмитировать нажатия клавиш, а так же ввода текста. Немного погуглив я нашел следующие модули:
- win_keyboard (модуль был удален)
- node-key-sender (использует Java, нет возможности использовать русские буквы)
- kbm-robot (использует Java)
- RobotJS (использует Python)
То есть у них есть проблемы с русскими символами. Что можно использовать вместо них?
Нужно избежать зависимости от Java, Python, а так же иметь поддержку русского текста.
Попытка использовать nut.js
const { keyboard, Key, mouse, left, right, up, down, screen } = require("@nut-tree/nut-js");
setTimeout(() =>
{
console.log('Пишем текст');
keyboard.type("русский текст");
}, 1000);
Ответы (1 шт):
Не ответ, а скорее тест.
Из коммента
nut.js не работает с русским текстом
Если научить, вышеуказанные пакеты, переключать раскладку и вводить латиницу(либо коды клавиш), вполне даже печатает.
В самом простом варианте, создаем карту RU->EN и подменяем символы.
Определить язык раскладки, можно пакетом keyboard-layout. Но мне не удалось запустить пример, когда активен RU. Вероятно класс Keyboard, при инициализации, что-то тоже определяет.
Невыполнимый сниппет:
import { keyboard, Key } from "@nut-tree/nut-js"
import { getCurrentKeymap } from 'keyboard-layout'
const keyMap = {
a: 'ф',
b: 'и',
c: 'с',
d: 'в',
e: 'у',
f: 'а',
g: 'п',
h: 'р',
i: 'ш',
j: 'о',
k: 'л',
l: 'д',
m: 'ь',
n: 'т',
o: 'щ',
p: 'з',
q: 'й',
r: 'к',
s: 'ы',
t: 'е',
u: 'г',
v: 'м',
w: 'ц',
x: 'ч',
y: 'н',
z: 'я',
'`': 'ё',
'[': 'х',
']': 'ъ',
';': 'ж',
'\'': 'э',
',': 'б',
'.': 'ю',
// Этот символ у меня(Num3) неправильно определяется
'#': '№'
}
const ruMap = Object.entries(keyMap)
.reduce((a, [key, ru]) => {
a.set(ru, key)
return a
}, new Map())
function isRU() {
return getCurrentKeymap().KeyA.unmodified === 'ф'
}
const KeyboardLayout = {
isRu: isRU(),
// isRu: false,
isUp: false,
async invertLang() {
// Если переключение раскладки [Левый Shift] + [Левый Alt]
await keyboard.pressKey(Key.LeftShift, Key.LeftAlt)
await keyboard.releaseKey(Key.LeftShift, Key.LeftAlt)
},
async any() {
if (!this.isRu) return
this.isRu = false
await this.invertLang()
},
async ru() {
if (this.isRu) return
this.isRu = true
await this.invertLang()
},
async upper() {
if (this.isUp) return
this.isUp = true
await keyboard.pressKey(Key.LeftShift)
},
async lower() {
if (!this.isUp) return
this.isUp = false
await keyboard.releaseKey(Key.LeftShift)
}
}
async function print(text) {
const sequence = []
const push = (s, lang, up = false) => {
const ul = up ? 'upper' : 'lower'
const last = sequence.length ? sequence[sequence.length - 1] : null
if (last && last[0] === lang && last[1] === ul) {
last.push(s)
return
}
sequence.push([lang, ul, s])
}
// Разбираем символы
for (let s of [...text]) {
// а-яё + №
if (/^[а-яё№]$/.test(s)) {
push(ruMap.get(s), 'ru')
} else if (/^[А-ЯЁ]$/.test(s)) {
push(ruMap.get(s.toLowerCase()), 'ru', true)
} else {
push(s, 'any')
}
}
// console.log(sequence)
// Пишем
for (let [lang, up, ...txt] of sequence) {
await KeyboardLayout[lang]()
await KeyboardLayout[up]()
await keyboard.type(txt.join(''))
}
}
keyboard.config.autoDelayMs = 10
// Запускать пример, только при раскладке EN
const exampleText = `// Test:
// Русский текст mixed with English
// \`1234567890-=
// ~!@#$%^&*()_+
// верхний ряд RU => "№;:?
// "небуквенные" => [];'\\,./{}:"|<>? ёхъжэбю. ЁХЪЖЭБЮ,
// end ^)`
print(exampleText)
С robotJS, точно такая история - ввод латиницы с раскладкой RU печатает как и положено.
