Задать вопрос
@Chesterfield25

Почему не срабатывает горячая клавиша в расширение?

Создал расширение которое должно открывать последнее свернутое окно при нажатии на горячую клавишу, оно работает нормально если хотя бы одно окно открыто, но в том то и проблема что изначально задумка в том что бы открывать последнее свернутое окно даже если все окна свернуты. Можно как то решить эту проблему?

{
    "manifest_version": 3,
    "name": "Open Last Minimized Window",
    "description": "Открывает последнее свернутое окно Chrome",
    "version": "1.0",
    "permissions": ["windows", "commands", "system"],
    "background": {
        "service_worker": "background.js"
    },
    "action": {
        "default_popup": "popup.html",
        "default_title": "Открыть последнее свернутое окно"
    },
    "commands": {
        "open-last-window": {
            "suggested_key": {
                "default": "Ctrl + Shift + M"
            },
            "description": "Открыть последнее свернутое окно"
        }
    }
}


let minimizedWindowsStack = [];

// Событие для отслеживания изменения состояния окон
chrome.windows.onBoundsChanged.addListener(async(windowId) => {
    const windows = await chrome.windows.getAll({ windowTypes: ["normal"] });

    for (const win of windows) {
        // Если окно свернуто и его нет в стеке, добавляем его
        if (win.state === "minimized" && !minimizedWindowsStack.includes(win.id)) {
            minimizedWindowsStack.push(win.id);
        }

        // Если окно больше не свернуто, удаляем его из стека
        if (win.state !== "minimized" && minimizedWindowsStack.includes(win.id)) {
            minimizedWindowsStack = minimizedWindowsStack.filter((id) => id !== win.id);
        }
    }

    console.log("Обновленный стек окон:", minimizedWindowsStack); // Для отладки
});

// Функция для открытия последнего свернутого окна
async function openLastMinimizedWindow() {
    if (minimizedWindowsStack.length === 0) {
        console.log("Нет свернутых окон.");
        return;
    }

    const lastMinimizedWindowId = minimizedWindowsStack.pop(); // Берём последнее окно из стека
    try {
        await chrome.windows.update(lastMinimizedWindowId, { state: "normal", focused: true });
        console.log(`Открыто окно с ID: ${lastMinimizedWindowId}`);
    } catch (error) {
        console.error("Ошибка активации окна:", error);
    }
}

// Обработка горячей клавиши
chrome.commands.onCommand.addListener((command) => {
    console.log(`Команда получена: ${command}`); // Логируем получение команды
    if (command === "open-last-window") {
        console.log("Выполняем открытие последнего свернутого окна...");
        openLastMinimizedWindow();
    }
});


// Прием команды от popup.js
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    if (message.command === "openLastMinimized") {
        openLastMinimizedWindow();
        sendResponse({ success: true });
    }
});

// Инициализация при старте
chrome.runtime.onStartup.addListener(async() => {
    const windows = await chrome.windows.getAll({ windowTypes: ["normal"] });
    minimizedWindowsStack = windows.filter((win) => win.state === "minimized").map((win) => win.id);
    console.log("Инициализация стека окон:", minimizedWindowsStack);
});

// Функция для открытия последнего активного окна
async function openLastWindow() {
    if (lastActiveWindowId) {
        try {
            await chrome.windows.update(lastActiveWindowId, { focused: true });
        } catch (e) {
            console.log("Ошибка при открытии окна:", e);
        }
    } else {
        console.log("Нет данных о последнем активном окне.");
    }
}


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Управление окнами</title>
</head>

<body>
    <h1>Открыть последнее окно</h1>
    <button id="open-last">Открыть</button>
    <button id="set-shortcut">Настроить горячие клавиши</button>
    <button id="reload-extension">Перезагрузить расширение</button>
    <!-- Кнопка для перезагрузки -->

    <script src="popup.js" defer></script>
</body>

</html>


document.getElementById("reload-extension").addEventListener("click", function() {
    chrome.runtime.reload(); // Перезагружает расширение
    console.log("Расширение перезагружено!");
});

// Обработчик для кнопки "Открыть"
document.getElementById("open-last").addEventListener("click", () => {
    chrome.runtime.sendMessage({ command: "openLastMinimized" }, (response) => {
        if (response && response.success) {
            console.log("Последнее свернутое окно открыто.");
        } else {
            console.error("Не удалось открыть окно.");
        }
    });
});

// Обработчик для кнопки "Настроить горячие клавиши"
document.getElementById("set-shortcut").addEventListener("click", function() {
    chrome.tabs.create({ url: "chrome://extensions/shortcuts" });
});
  • Вопрос задан
  • 52 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
Aetae
@Aetae Куратор тега JavaScript
Тлен
Можно попробовать так(раньше работало), но скорее всего убрали уже(не проверял):
"open-last-window": {
  "suggested_key": {
    "default": "Ctrl + Shift + M"
  },
  "global": true,
  "description": "Открыть последнее свернутое окно"
}

Если не заработает - остаётся только просить пользователя ручками выбрать:
6740c5103ef84675182753.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы