2017-11-19 29 views
4

웹 사이트의 데스크탑 인터페이스를 만드는 전자 응용 프로그램을 만들고 있습니다. 웹 사이트에서 이미 사용 가능한 모든 키 바인딩 테이블을 보여주는 Shift+? 같은 키 바인딩이 등록되어 있습니다.전자 메일에서 웹 콘텐트에 키 바인딩을 보내는 (에뮬레이트하는) 방법은 무엇입니까?

키 바인딩에 해당하는 작업의 앱 메뉴를 만들어야합니다. 기술적으로 사용자가 메뉴 항목을 클릭하면 웹 페이지에서 키 바인딩이 실행됩니다. 예 :

메뉴 → Shift+? 키 바인딩의 사용자를 누르 도움말가 → 트리거되는 웹 페이지 keypress → 웹 페이지에 등록 된 모든 키 바인딩의 테이블이 나타납니다 보여줍니다 감지

.

문제는 webContentsShift+? 키 바인딩을 보낼 수 없다는 것입니다. 이 시도는 실패 :

webContents.sendInputEvent({type:'char', keyCode: 'Shift+?' }); 
webContents.sendInputEvent({type:'keydown', keyCode: 'Shift+?' }); 
webContents.sendInputEvent({type:'keyup', keyCode: 'Shift+?'}); 

어떻게 (a.k.a 웹 페이지에 키 바인딩 전송) 특정 키 바인딩을 기반으로 작업을 수행 할 수있는 웹 페이지를 강제 할 수 있습니까?

UPD : 몇 가지 세부 정보를 찾았습니다. 이벤트 순서는 keyDown, char, keyUp이어야합니다.

function sendKeybinding(win, keyCode) { 
    win.webContents.sendInputEvent({ type: 'keyDown', keyCode }); 
    win.webContents.sendInputEvent({ type: 'char', keyCode }); 
    win.webContents.sendInputEvent({ type: 'keyUp', keyCode }); 
} 

이 다음과 같을 수 사용하는 MenuItem : ? 만 입력 할 수 있습니다 Shift+?이있는 경우에는 해치가

또한
{ 
    label: 'Show Keymap', 
    accelerator: ['Shift+/', '?'], 
    click(menuItem, browserWindow) { 
    sendKeybinding(browserWindow, '?'); 
    }, 
} 

, 나는 전송 키 바인딩을위한 편리한 기능을 만든 Shift을 누르면 실제적으로 두 개의 가속기 Shift+/?가 있습니다.

그러나 나는 아직도 CmdOrControl+B과 같은 키 바인딩을 입력하는 방법을 모른다.

+0

당신은 argument 객체의'modifiers' 속성을 사용하여 ried를 작성 했습니까? 'modifiers = [];처럼. modifiers.push ('shift'); sendInputEvents ({type : 'keyDown', modifiers, keyCode})' – pergy

답변

1

이벤트 순서에 더하여 modifiers 속성을 sendInputEvents 인수로 사용하여 키 입력으로 shift/ctrl/alt 등 변경자를 보낼 수 있습니다. 더 자세한 내용은 당신이 원하는 바로 가기 감지 할 수있는 다음과 같은 코드를 HTML로

docs를 참조 :

main.js를

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

function sendKeybinding (win, keyCode) { 
    let modifiers = [] 
    modifiers.push('shift') // 'control', 'meta', etc. 
    win.webContents.sendInputEvent({ type: 'keyDown', modifiers, keyCode }) 
    win.webContents.sendInputEvent({ type: 'char', modifiers, keyCode }) 
    win.webContents.sendInputEvent({ type: 'keyUp', modifiers, keyCode }) 
} 

app.on('ready', function() { 
    let win = new BrowserWindow() 
    win.loadURL(path.resolve(__dirname, 'keybind.html')) 
    const menuTemplate = [ 
    { 
     label: 'Show Keymap', 
     click (menuItem, browserWindow) { 
     sendKeybinding(browserWindow, '?') 
     } 
    } 
    ] 
    const menu = Menu.buildFromTemplate(menuTemplate) 
    Menu.setApplicationMenu(menu) 
}) 

keybind.html

<html> 
<body> 
<p id="demo">Pressed Key: </p> 
<script> 
document.onkeypress = function (event) { 
    var elem = document.getElementById("demo") 
    elem.innerHTML = 'Pressed Key: ' + event.key 
    if (event.shiftKey) elem.innerHTML += ' + Shift ' 
    if (event.ctrlKey) elem.innerHTML += ' + Ctrl ' 
    if (event.metaKey) elem.innerHTML += ' + Win/Cmd ' 
} 
</script> 
</body> 
</html> 
+0

'Shift'처럼 작동하는 것 같습니다. 그러나'Cmd' 키를 ​​어떻게 처리 할 수 ​​있습니까? – denysdovhan

+0

HTML 쪽에서 [event.metaKey'] (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/metaKey)로 매핑 될 것이므로 수정 자'meta' (하지만 나는 맥을 가지고 있지 않다. 테스트 할 수 없다.) – pergy