TL; DR
require('global-shortcut') を使う
- イベントハンドラの登録は
app.on('ready')
イベントの中で行う
やりたいこと
Mac でいう Alfred みたいな常駐型キーワードランチャー的な何かが作りたいので、キーボードショートカットで画面が現れたり隠れるようにしたい。
やってみた
コードの全体は こちら に置いてます。
main.js
var app = require('app');
var BrowserWindow = require('browser-window');
var globalShortcut = require('global-shortcut');
require('crash-reporter').start();
var mainWindow = null;
app.on('window-all-closed', function() {
app.quit();
});
app.on('ready', function() {
mainWindow = new BrowserWindow({width: 800, height: 600});
mainWindow.loadUrl('file://' + __dirname + '/index.html')
mainWindow.on('closed', function() {
mainWindow = null;
});
var displayWindow = true;
var ret = globalShortcut.register('Ctrl + Shift + x', function() {
if (displayWindow) {
mainWindow.hide();
displayWindow = false;
} else {
mainWindow.show();
displayWindow = true;
}
});
if (!ret) {
console.log('registration fails');
}
});
大事なのは globalShortcut.register()
によるイベントハンドラの登録を app.ready('on')
の中で行うことです。
その前に登録しようとすると、起動時に以下のようなエラーとともに異常終了します。
$ ~/Downloads/Atom.app/Contents/MacOS/Atom .
[24383:0413/032658:FATAL:global_shortcut_listener_mac.mm(64)] Check failed: BrowserThread::CurrentlyOn(BrowserThread::UI).
[1] 24383 trace trap ~/Downloads/Atom.app/Contents/MacOS/Atom .