Сделать глобальный ярлык настраиваемым в электронном приложении - PullRequest
3 голосов
/ 06 апреля 2020

Я упаковал веб-приложение (программный телефон) в электронное приложение, чтобы воспользоваться несколькими автоматизациями, которые я могу кодировать в приложение с помощью электрона.
Я использую электроны globalShortcut , чтобы зарегистрировать глобальный ярлык для перенести приложение на передний план и сосредоточиться на панели поиска веб-приложения.

Однако, поскольку мои коллеги также начали использовать приложение, я хочу сделать используемый глобальный ярлык настраиваемым.
Как У меня нет возможности изменить само веб-приложение (оно размещено третьей стороной), я не знаю, как создать меню, в котором пользователь может настроить ярлык.
Я знаю, что есть объекты menu и menuItem , но я не знаю, как попросить пользователя указать ключ или комбинацию клавиш для установки в качестве globalShortcut, используя это.

Как это сделать?

Редактировать:
Чтобы уточнить, что я ожидаю: Как я уже объяснил, я ищу любое решение, которое позволило бы предложить меню, в котором можно настроить ярлык. Это меню может располагаться в строке меню / панели инструментов или может быть помещено в веб-документ с помощью javascript манипулирования DOM - возможно, с помощью iframe в качестве последнего средства?
Любая идея о том, как сохранить настройки при перезапусках приложения, также оценили.

Ответы [ 2 ]

4 голосов
/ 16 апреля 2020

Допустим, функция hotkeySettings.html

<!DOCTYPE html>
<html lang="en">
  <head> </head>
  <body>
    <input id="hotkey" onkeyup="keyUp(event)" />
    <button id="save" onclick="saveHotkey()">save</button>
    <script>
      const storage = require("electron-json-storage");
      async function loadHotkey() {
        storage.get("hotkey", function (error, key) {
          document.getElementById("hotkey").value = key;
        });
      }
      async function saveHotkey() {
        const { globalShortcut } = require("electron").remote;

        const hotkey = document.getElementById("hotkey").value;
        await storage.set("hotkey", hotkey);
        globalShortcut.register(hotkey, () => {
          console.log(hotkey, "key pressed");
        });
      }
      function keyUp(event) {
        const keyCode = event.keyCode;
        const key = event.key;
        const charCode = event.code;

        if ((keyCode >= 16 && keyCode <= 18) || keyCode === 91) return;

        const value = [];
        event.ctrlKey ? value.push("Control") : null;
        event.shiftKey ? value.push("Shift") : null;
        event.isAlt ? value.push("Alt") : null;
        value.push(key.toUpperCase());

        document.getElementById("hotkey").value = value.join("+");
      }
      loadHotkey();
    </script>
  </body>
</html>

loadHotkey: загрузит предварительно зарегистрированную горячую клавишу. Горячая клавиша находится в функции appData.

saveHotKey: зарегистрирует новую горячую клавишу на основе вашего ввода и сохранит это значение в appData, чтобы оно сохранялось.

При main.js

...
// Open this browserWindow when you click menuItem to see the registered hotkey
// And to update the hotkey
const hotkeySettingsWindow = new BrowserWindow({
    height: 600,
    width: 600,
    webPreferences: {
      nodeIntegration: true
    }
})
hotkeySettingsWindow.loadFile('hotkeySettings.html')
2 голосов
/ 16 апреля 2020

После просмотра этого вопроса я провел небольшое исследование вашей темы c. Первое, что пришло в голову, это то, что электрон дает доступ для прослушивания ключевых событий, но в соответствии с этим поток разработчики электронов останавливают электрон, являясь кейлоггером . Таким образом, у меня есть следующий метод для этой проблемы. Я не знаю, являются ли они лучшими для этого сценария, но так я вижу, как это можно сделать. Это в основном построено вокруг электронного хранилища, где оно может быть использовано для сохранения определенной пользователем комбинации клавиш. Таким образом, приложение может извлечь определенную комбинацию клавиш из хранилища (если комбинации не настроены, она использует комбинацию клавиш по умолчанию, указанную в схеме) и зарегистрировать globalshortcut, используя ее. Я предоставил инструкции по его реализации

  1. Установите и настройте значение ключа по умолчанию, используя электронный магазин . Как следует

main. js

const Store = require('electron-store'); 
const schema = {
    defaultKeyCombination: {
        type: 'string',
        default: 'CommandOrControl+Y'
    }
}
const store = new Store({schema});
Импортируя defaultKeyCombination, вы можете зарегистрировать глобальный ярлык , когда приложение будет готово. (не забудьте удалить globalshortcut, когда приложение уничтожено)

app.on('ready', () => { // Register a defaultKeyCombination shortcut listener. globalShortcut.register(store.get('defaultKeyCombination'), () => { // Do stuff when Y and either Command/Control is pressed. }) })

Создайте и откройте другое окно браузера с помощью щелчка меню (меню> параметры> настроить) и разрешите пользователям создавать / вводить модификаторы ускорителя в поле ввода, используя доступные модификаторы и коды клавиш (их лучше показывать в новом окне под полем ввода); Например: пользователь может ввести MODIFIER + KEY_CODE , как CmdOrCtrl + A, для ввода в браузере.

После того, как пользователь нажмет Кнопка submit отправляет введенную комбинацию клавиш с помощью IPCRenderer в основной процесс и устанавливает значение хранилища defaultKeyCombination по полученному значению.

Запуск IP C чтобы отправить ответ, сказав пользователю «Пожалуйста, перезапустите приложение» и отобразите его в виде предупреждения или чего-либо еще.

Процесс визуализации

let args = "CmdOrCtrl+A"
ipcRenderer.send('set::keycombine',args)

ipcRenderer.on('done::keycombine', (event, arg) => {
  // display message to restart the app
})

Основной процесс

ipcMain.on('set::keycombine', (event, arg) => {
  console.log(arg) // prints "keycombine"
  //setting the new value
  store.set('defaultKeyCombination', arg)
 // sending reply to renderer work is done
  event.reply('done::keycombine')
})

Как только приложение перезапустится, магазин загрузит новую настроенную комбинацию клавиш и зарегистрирует событие быстрого доступа, используя ее.

Это то, что я вспомнил, выполняя это небольшое исследование. Здесь я нашел ключевого слушателя событий под названием iohook , но он доступен только для электрона 2.XX. В вышеописанном процессе могут быть ошибки и проблемы с потоком, я только что опубликовал код, чтобы получить представление.

Редактировать 1:

Это мои примеры. В моем индексе. html Я определил кнопку для вызова функции set (). Вы можете интегрировать поле ввода, чтобы вы могли вводить команды. Как только ключ установлен в хранилище, он всегда загружается с этим новым значением ключа, если пользователь не изменит его. Вы можете прочитать больше о электронном магазине здесь Надеюсь, что это даст вам представление:)

Main. js

const {app, BrowserWindow, ipcMain } = require('electron')
const Store = require('electron-store'); 
const schema = {
    defaultKeyCombination: {
        type: 'string',
        default: 'CommandOrControl+Y'
    }
}
const store = new Store({schema});

console.log(store.get("defaultKeyCombination"))

function createWindow () {
  const window = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  })

  window.loadFile('./index.html')
  // window.loadURL("https://www.zap.co.il")
  window.webContents.openDevTools()
}
ipcMain.on('set::keycombine', (event, arg) => {
  console.log(arg) // prints "keycombine"
  //setting the new value
  store.set('defaultKeyCombination', arg)
 // sending reply to renderer work is done with new key 
  event.reply('done::keycombine', store.get('defaultKeyCombination'))
})


app.whenReady().then(createWindow)

//app.on('ready', createWindow)

app.on('window-all-closed', () => {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

Renderer. js

const { ipcRenderer } = require('electron')
function set() {
    console.log("clicked")
    let args = "CmdOrCtrl+A"
ipcRenderer.send('set::keycombine',args)

}
ipcRenderer.on('done::keycombine', (event, arg) => {
    console.log("DONEEEEEEEEEE", arg)
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...