From 2767acb73ee65b2345b903c5bab1645e000a6c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=86=8A=E6=BD=87?= Date: Mon, 2 Feb 2026 18:31:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20index.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.ts | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 index.ts diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..7f0285b --- /dev/null +++ b/index.ts @@ -0,0 +1,89 @@ +import { keyboard, Key } from "@nut-tree-fork/nut-js"; + +/** + * 控制功能部分的案件映射 + */ +export const keyMap: Record = { + 'ctrl': Key.LeftControl, + 'leftctrl': Key.LeftControl, + 'rightctrl': Key.RightControl, + 'alt': Key.LeftAlt, + 'leftalt': Key.LeftAlt, + 'rightalt': Key.RightAlt, + 'shift': Key.LeftShift, + 'leftshift': Key.LeftShift, + 'rightshift': Key.RightShift, + 'meta': Key.LeftSuper, + 'cmd': Key.LeftCmd, + 'win': Key.LeftWin, + // 根据操作系统选择 Ctrl 或 Command 键 + 'ctrlorcommand': process.platform === 'darwin' ? Key.LeftCmd : Key.LeftControl, +}; + +/** + * 将快捷键字符串转换为 Key 枚举值 + * @param hotkey + * @returns + */ +export const parseHotkey = (hotkey: string): Key[] => { + return hotkey + .toLowerCase() + .split('+') + .map(key => { + const trimmed = key.trim().toLowerCase(); + // 如果是修饰键,从映射表中获取 + if (keyMap[trimmed]) { + return keyMap[trimmed]; + } + // 如果是字母,转换为大写并查找对应的 Key + if (trimmed.length === 1 && /[a-z]/.test(trimmed)) { + const upperKey = trimmed.toUpperCase(); + return Key[upperKey as keyof typeof Key] as Key; + } + // 其他情况直接查找 + return Key[trimmed as keyof typeof Key] as Key; + }) + .filter((key): key is Key => key !== undefined); +} + +type PressHostKeysOptions = { + hotkey: string; + durationMs?: number; +} +export const pressHotkey = async (opts: PressHostKeysOptions): Promise => { + const { hotkey, durationMs = 100 } = opts; + const keys = parseHotkey(hotkey); + + console.log('准备模拟按下快捷键:', hotkey); + // 同时按下所有键 + await keyboard.pressKey(...keys); + // 短暂延迟后释放 + await new Promise(resolve => setTimeout(resolve, durationMs)); + // 释放所有键 + await keyboard.releaseKey(...keys); + return true +} + +/** + * 模拟按下一组快捷键,支持逗号分隔的多个快捷键 + * @param opts + * @returns + */ +export const pressHotkeys = async (opts: PressHostKeysOptions): Promise => { + let { hotkey } = opts; + hotkey = hotkey.replace(/\s+/g, ''); // 去除所有空格 + const hotkeyList = hotkey.split(',').map(hk => hk.trim()); + if (hotkeyList.length === 0) { + return await pressHotkey({ ...opts, hotkey }); + } + for (const hk of hotkeyList) { + await pressHotkey({ ...opts, hotkey: hk }); + // 每个快捷键之间稍作延迟 + await new Promise(resolve => setTimeout(resolve, 200)); + } + return true; +} +export class Hotkeys { + pressHotkey = pressHotkey; + pressHotkeys = pressHotkeys; +} \ No newline at end of file