Merge pull request #444 from lanxiuyun/ctrl+ctrl

Double click the modifer to pop up window
This commit is contained in:
muwoo 2025-07-24 14:10:09 +08:00 committed by GitHub
commit f70bf3983e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 118 additions and 30 deletions

View File

@ -274,12 +274,16 @@ const state = reactive({
custom: {}, custom: {},
}); });
// lastKeyPressTime
const lastKeyPressTime = ref(0);
const DOUBLE_CLICK_THRESHOLD = 300; //
const isWindows = window?.rubick?.isWindows(); const isWindows = window?.rubick?.isWindows();
const tipText = computed(() => { const tipText = computed(() => {
const optionKeyName = isWindows ? 'Alt' : 'Option、Command'; const optionKeyName = isWindows ? 'Alt' : 'Option、Command';
return t('feature.settings.global.addShortcutKeyTips', { return t('feature.settings.global.addShortcutKeyTips', {
optionKeyName: optionKeyName, optionKeyName: optionKeyName,
}); }) + `此外你也可以双击修饰键如Ctrl+Ctrl`;
}); });
const currentSelect = ref(['userInfo']); const currentSelect = ref(['userInfo']);
@ -314,33 +318,60 @@ watch(state, setConfig);
const changeShortCut = (e, key) => { const changeShortCut = (e, key) => {
let compose = ''; let compose = '';
// const currentTime = Date.now();
let incluFuncKeys = false; const isDoubleClick = currentTime - lastKeyPressTime.value < DOUBLE_CLICK_THRESHOLD;
lastKeyPressTime.value = currentTime;
// F1-F12
if (e.keyCode >= 112 && e.keyCode <= 123) {
state.shortCut[key] = keycodes[e.keyCode].toUpperCase();
return;
}
//
if (isDoubleClick) {
if (e.keyCode === 17) { // Ctrl
state.shortCut[key] = 'Ctrl+Ctrl';
return;
}
if (e.keyCode === 18) { // Alt
state.shortCut[key] = 'Option+Option';
return;
}
if (e.keyCode === 16) { // Shift
state.shortCut[key] = 'Shift+Shift';
return;
}
if (e.keyCode === 93) { // Command
state.shortCut[key] = 'Command+Command';
return;
}
}
// +
let hasModifierKey = false;
if (e.ctrlKey && e.keyCode !== 17) { if (e.ctrlKey && e.keyCode !== 17) {
compose += '+Ctrl'; compose += '+Ctrl';
incluFuncKeys = true; hasModifierKey = true;
} }
if (e.shiftKey && e.keyCode !== 16) { if (e.shiftKey && e.keyCode !== 16) {
compose += '+Shift'; compose += '+Shift';
incluFuncKeys = true; hasModifierKey = true;
} }
if (e.altKey && e.keyCode !== 18) { if (e.altKey && e.keyCode !== 18) {
compose += '+Option'; compose += '+Option';
incluFuncKeys = true; hasModifierKey = true;
} }
if (e.metaKey && e.keyCode !== 93) { if (e.metaKey && e.keyCode !== 93) {
compose += '+Command'; compose += '+Command';
incluFuncKeys = true; hasModifierKey = true;
} }
//
if (hasModifierKey) {
compose += '+' + keycodes[e.keyCode].toUpperCase(); compose += '+' + keycodes[e.keyCode].toUpperCase();
compose = compose.substring(1); compose = compose.substring(1);
if (
incluFuncKeys &&
e.keyCode !== 16 &&
e.keyCode !== 17 &&
e.keyCode !== 18 &&
e.keyCode !== 93
) {
state.shortCut[key] = compose; state.shortCut[key] = compose;
} else { } else {
// //

View File

@ -39,6 +39,7 @@
"pouchdb-load": "^1.4.6", "pouchdb-load": "^1.4.6",
"pouchdb-replication-stream": "^1.2.9", "pouchdb-replication-stream": "^1.2.9",
"simple-plist": "0.2.1", "simple-plist": "0.2.1",
"uiohook-napi": "^1.5.4",
"vue": "^3.0.0", "vue": "^3.0.0",
"vue-router": "^4.0.0-0", "vue-router": "^4.0.0-0",
"vuex": "^4.0.0-0", "vuex": "^4.0.0-0",

View File

@ -10,6 +10,7 @@ import {
import screenCapture from '@/core/screen-capture'; import screenCapture from '@/core/screen-capture';
import localConfig from '@/main/common/initLocalConfig'; import localConfig from '@/main/common/initLocalConfig';
import winPosition from './getWinPosition'; import winPosition from './getWinPosition';
import { uIOhook, UiohookKey } from 'uiohook-napi';
const registerHotKey = (mainWindow: BrowserWindow): void => { const registerHotKey = (mainWindow: BrowserWindow): void => {
// 设置开机启动 // 设置开机启动
@ -57,14 +58,8 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
} }
}; };
const init = async () => { // 显示主窗口
await setAutoLogin(); function mainWindowPopUp() {
await setDarkMode();
await setTheme();
const config = await localConfig.getConfig();
globalShortcut.unregisterAll();
// 注册偏好快捷键
globalShortcut.register(config.perf.shortCut.showAndHidden, () => {
const currentShow = mainWindow.isVisible() && mainWindow.isFocused(); const currentShow = mainWindow.isVisible() && mainWindow.isFocused();
if (currentShow) return mainWindow.hide(); if (currentShow) return mainWindow.hide();
const { x: wx, y: wy } = winPosition.getPosition(); const { x: wx, y: wy } = winPosition.getPosition();
@ -76,8 +71,30 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
}); });
mainWindow.setPosition(wx, wy); mainWindow.setPosition(wx, wy);
mainWindow.show(); mainWindow.show();
}); }
const init = async () => {
await setAutoLogin();
await setDarkMode();
await setTheme();
const config = await localConfig.getConfig();
globalShortcut.unregisterAll();
// 注册偏好快捷键
// 处理显示/隐藏快捷键的注册
const doublePressShortcuts = ['Ctrl+Ctrl', 'Option+Option', 'Shift+Shift', 'Command+Command'];
const isDoublePressShortcut = doublePressShortcuts.includes(config.perf.shortCut.showAndHidden);
if (isDoublePressShortcut) {
// 双击快捷键(如 Ctrl+Ctrl详见 uIOhookRegister 函数实现
} else {
// 注册普通快捷键(如 Ctrl+Space、F8 等)
globalShortcut.register(config.perf.shortCut.showAndHidden, () => {
mainWindowPopUp();
});
}
// 截图快捷键
globalShortcut.register(config.perf.shortCut.capture, () => { globalShortcut.register(config.perf.shortCut.capture, () => {
screenCapture(mainWindow, (data) => { screenCapture(mainWindow, (data) => {
data && data &&
@ -107,9 +124,48 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
}); });
}); });
}; };
uIOhookRegister(mainWindowPopUp);
init(); init();
ipcMain.on('re-register', () => { ipcMain.on('re-register', () => {
init(); init();
}); });
}; };
export default registerHotKey; export default registerHotKey;
function uIOhookRegister(callback: () => void) {
let lastModifierPress = Date.now();
uIOhook.on('keydown', async (uio_event) => {
const config = await localConfig.getConfig(); // 此处还有优化空间
if (
![
'Ctrl+Ctrl',
'Option+Option',
'Shift+Shift',
'Command+Command',
].includes(config.perf.shortCut.showAndHidden)
) {
return;
}
// 双击快捷键,如 Ctrl+Ctrl
const modifers = config.perf.shortCut.showAndHidden.split('+');
const showAndHiddenKeyStr = modifers.pop(); // Ctrl
const keyStr2uioKeyCode = {
Ctrl: UiohookKey.Ctrl,
Shift: UiohookKey.Shift,
Option: UiohookKey.Alt,
Command: UiohookKey.Comma,
};
if (uio_event.keycode === keyStr2uioKeyCode[showAndHiddenKeyStr]) {
const currentTime = Date.now();
if (currentTime - lastModifierPress < 300) {
callback(); // 调用 mainWindowPopUp
}
lastModifierPress = currentTime;
}
});
uIOhook.start();
}