2016-04-27 37 views
8

我在寻找复制类似于Launchy/Quicksilver/Spotlight的行为。使用全局快捷方式将电子应用程序移至前景(如Spotlight/Launchy)

我想要一个始终运行的电子应用程序。当我点击一个快捷键时,电子应用程序被带到前台并聚焦。

据我所知,globalShortcut模块可以用来绑定一个快捷方式,但我不知道如何使该快捷方式触发应用程序到前台。

任何帮助,将不胜感激......

回答

12

让我们先从最简单的情况,然后建立我们的解决方案,以更好地处理一些边缘情况。

最简单的情况是显示一个窗口,只要我们注册的全局快捷方式被按下,窗口就已经打开。

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

let mainWindow = null; 

app.on('ready',() => { 

    mainWindow = new BrowserWindow(); 
    mainWindow.loadURL(path.join(__dirname, 'index.html')); 

    const shortcut = globalShortcut.register('Control+Space',() => { 
    mainWindow.show(); 
    }); 

    if (!shortcut) { console.log('Registration failed.'); } 

}); 

虽然这段代码有一些问题。好消息是,如果窗口已经最小化,它仍然有效。坏消息是,如果窗口关闭,它将不起作用。这是因为关闭最后一个窗口会退出应用程序。游民。 (坦率地说,我对此有点感到惊讶 - 但那就是发生了什么事情,所以,让我们一起去吧。)

让我们停止发生。

app.on('window-all-closed', (event) => { 
    event.preventDefault(); 
}); 

好的,我们的应用程序不会退出,但它会崩溃。

Uncaught Exception: 
Error: Object has been destroyed 

好的,很好。这是因为窗户靠近时会被破坏。所以,我们不要关闭它。让我们把它藏起来吧?在app.on('ready',() => {…}),添加以下内容:

mainWindow.on('close', (event) => { 
    event.preventDefault(); 
    mainWindow.hide(); 
}); 

最终的结果看起来是这样的:

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

let mainWindow = null; 

app.on('ready',() => { 

    mainWindow = new BrowserWindow(); 
    mainWindow.loadURL(path.join(__dirname, 'index.html')); 

    const shortcut = globalShortcut.register('Control+Space',() => { 
    mainWindow.show(); 
    }); 

    if (!shortcut) { console.log('Registration failed.'); } 

    mainWindow.on('close', (event) => { 
    event.preventDefault(); 
    mainWindow.hide(); 
    }); 

}); 


app.on('window-all-closed', (event) => { 
    event.preventDefault(); 
}); 

有了这样你应该有到位的基本功能。你按下你的全局快捷键,出现窗口。关闭它,然后按下键并观察它重新出现。

相关问题