Не могу понять `sendInputEvent` в webContents в ElectronJS - PullRequest
0 голосов
/ 07 ноября 2018

В Gmail ярлык compose - c, и я использую forcedWindow.webContents.sendInputEvent({type: 'keyDown', keyCode: 'c'}); для вызова функции compose, но она не работает, я должен добавить keyUp и char, и тогда будет работать

forcedWindow.webContents.sendInputEvent({type: 'keyDown', keyCode: 'c'});
forcedWindow.webContents.sendInputEvent({type: 'char', keyCode: 'c'});
forcedWindow.webContents.sendInputEvent({type: 'keyUp', keyCode: 'c'});

Вот мои вопросы

  1. Что означает char? 1015 *

  2. Если я позвоню Go to Tasks ярлык g + k, как мне обновить код?

Спасибо.

Обновлено: вот полные коды

 {
label: 'Edit',
submenu: [
  {
    label: 'Compose',
    accelerator: 'CmdOrCtrl+N',
    click(menuItem, forcedWindow, options) {
      if (forcedWindow) {
        forcedWindow.webContents.sendInputEvent({type: 'keyDown', keyCode: 'c'});
        forcedWindow.webContents.sendInputEvent({type: 'char', keyCode: 'c'});
        forcedWindow.webContents.sendInputEvent({type: 'keyUp', keyCode: 'c'});
      }
    }
  }
 ]
}

Если я изменю коды вот так

{
label: 'Edit',
submenu: [
  {
    label: 'Compose',
    accelerator: 'CmdOrCtrl+N',
    click(menuItem, forcedWindow, options) {
      if (forcedWindow) {
        forcedWindow.webContents.sendInputEvent({type: 'keyDown', keyCode: 'c'});
      }
    }
  }
 ]
}

или как это

{
label: 'Edit',
submenu: [
  {
    label: 'Compose',
    accelerator: 'CmdOrCtrl+N',
    click(menuItem, forcedWindow, options) {
      if (forcedWindow) {
        forcedWindow.webContents.sendInputEvent({type: 'char', keyCode: 'c'});
      }
    }
  }
 ]
}

или как это

{
label: 'Edit',
submenu: [
  {
    label: 'Compose',
    accelerator: 'CmdOrCtrl+N',
    click(menuItem, forcedWindow, options) {
      if (forcedWindow) {
        forcedWindow.webContents.sendInputEvent({type: 'keyUp', keyCode: 'c'});
      }
    }
  }
 ]
}

ни один из них не работает, почему?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

При отправке вручную из Electron мы можем отправлять на HTML-страницу следующие события:

  • keydown: отправить keyDown
  • keypress: отправить keyDown + char
  • keyup: отправить keyUp

Событие char, представляющее, что нажатая клавиша содержит символьное значение, соответствующее описанию keypress события *1019* в целом .

Событие нажатия клавиши запускается, когда клавиша, выдающая символьное значение нажата. Примеры ключей, которые производят символьное значение: буквенные, цифровые и знаки пунктуации. Примеры ключей, которые не Для получения значения символа используются клавиши-модификаторы, такие как Alt, Shift, Ctrl, или мета.

При нажатии буквенной клавиши на клавиатуре он мгновенно генерирует события keydown и keypress, поэтому разумно с веб-сайта прослушивать событие keypress (что, похоже, делает Gmail)

Чтобы вручную активировать этих слушателей, вы должны отправить хотя бы keyDown + char. Вот пример для ваших дел

const { app, BrowserWindow } = require('electron')

app.once('ready', () => {
  const win = new BrowserWindow()
  win.loadURL('https://gmail.com')

  win.webContents.once('did-finish-load', () => {
    // Compose
    setTimeout(() => {
      console.log('compose...')
      win.webContents.sendInputEvent({type: 'keyDown', keyCode: 'c'})
      win.webContents.sendInputEvent({type: 'char', keyCode: 'c'})
    }, 1000)
    // Cancel Compose
    setTimeout(() => {
      console.log('cancel...')
      win.webContents.sendInputEvent({type: 'keyDown', keyCode: 'escape'})
      win.webContents.sendInputEvent({type: 'char', keyCode: 'escape'})
    }, 2000)
    // Go to Tasks
    setTimeout(() => {
      console.log('go to tasks...')
      win.webContents.sendInputEvent({type: 'keyDown', keyCode: 'g'})
      win.webContents.sendInputEvent({type: 'char', keyCode: 'g'})
      win.webContents.sendInputEvent({type: 'keyDown', keyCode: 'k'})
      win.webContents.sendInputEvent({type: 'char', keyCode: 'k'})
    }, 3000)
  })
})

Ради полноты вы должны отправлять keyUp s после каждого keyDown + char, если хотите избежать выброса keypress для каждого последующего char. Но это минимум, который Gmail, кажется, слушает.


Соответствующий код хрома, если вы заинтересованы: https://cs.chromium.org/chromium/src/third_party/blink/public/platform/web_input_event.h

0 голосов
/ 08 ноября 2018

Я думаю, что вы на правильном пути, но в документации для sendInputEvent говорится, что keyCode должен быть действительным ключом ускорения.

Из документов:

keyCode String (обязательно) - символ, который будет отправлен как событие клавиатуры. Следует использовать только действующие коды ключей в ускорителе.

И если вы посмотрите на документы для ускорителя , там написано, что буквы должны быть в верхнем регистре.

Таким образом, c в вашем коде будет в верхнем регистре следующим образом:

forcedWindow.webContents.sendInputEvent({type: 'keyDown', keyCode: 'C'});

sendInputEvent Документы

Действительные коды клавиш ускорителя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...