以前的窗口焦点/电子

时间:2018-06-01 11:10:59

标签: electron

目前正在艰难地抓挠我的头脑。我刚从电子开始,到目前为止一直很好。但是,当窗口被隐藏时(它是一个显示快捷方式的弹出窗口,按下回车键时会消失),我想将焦点重新放回上一个窗口。

我正在使用Mac,菜单栏显示我以前的应用程序名称,因此看起来焦点会回复给应用程序,但不完全是因为未选择窗口。

知道如何解决这个问题吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

我刚刚在Github上发布了一个名为Popup Window的电子测试应用程序,它展示了如何正确地将焦点重新放回到上一个窗口。它是我以前的一个项目的简化版本,仅限macOS。我遇到了你遇到的完全相同的问题,我记得我通过隐藏应用而不是窗口来解决它,并处理窗口模糊事件以实际隐藏它......

... HTH

<强> main.js

const { app, BrowserWindow, globalShortcut, ipcMain } = require ('electron');
let mainWindow = null;
function onAppReady ()
{
    mainWindow = new BrowserWindow
    (
        {
            width: 600,
            height: 600,
            show: false,
            frame: false
        }
    );
    mainWindow.loadURL (`file://${__dirname}/index.html`);
    mainWindow.once ('closed', () => { mainWindow = null; });
    mainWindow.on ('blur', () => { mainWindow.hide (); });
    globalShortcut.register ("CommandOrControl+Alt+P", () => { mainWindow.show (); });
    ipcMain.on ('dismiss', () => { app.hide (); });
}
app.once ('ready', onAppReady);
app.once ('window-all-closed', () => { app.quit (); });
app.dock.hide ();


的index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    <!-- All of the Node.js APIs are available in this renderer process. -->
    We are using Node.js <script>document.write(process.versions.node)</script>,
    Chromium <script>document.write(process.versions.chrome)</script>,
    and Electron <script>document.write(process.versions.electron)</script>.

    <script>
      // You can also require other files to run in this process
      require('./renderer.js')
    </script>
  </body>
</html>


renderer.js

const { ipcRenderer } = require ('electron');
document.addEventListener
(
    'keydown',
    (event) =>
    {
        if (event.key === 'Enter')
        {
            event.preventDefault ();
            ipcRenderer.send ('dismiss');
        }
    }
);

答案 1 :(得分:1)

添加此内容对我有用:

jQuery(function($){
    $('#loadmore').click(function(){
        $(this).text('Loading...');
        var data = {
            'action': 'loadmore',
            'query': products_query,
        };
        $.ajax({
            url:ajaxurl,
            data:data,
            type:'POST',
            success:function(data){
                if( data ) { 
                    let btn = '#loadmore';
                    let wrapper = '#showcase';
                    $(btn).text('Load More');
                    $(wrapper).append(data);
                }
                    
            }
        });
    });
});

我使用function loadmore_posts(){ $args = unserialize( stripslashes( $_POST['query'] ) ); query_posts( $args ); if( have_posts() ) : woocommerce_product_loop_start(); while( have_posts() ): the_post(); wc_get_template_part( 'content', 'product' ); endwhile; woocommerce_product_loop_end(); wp_reset_postdata(); endif; die(); } add_action('wp_ajax_loadmore', 'loadmore_posts'); add_action('wp_ajax_nopriv_loadmore', 'loadmore_posts'); 隐藏应用程序,并在模糊侦听器上添加mainWindow.on('blur', () => app.hide()) ,将焦点返回到上次使用的应用程序。

答案 2 :(得分:0)

对于Linux: 我发现browserWindow.hide()可以正确恢复焦点。

对于Windows: browserWindow.minimize()正确地恢复了焦点。

对于Mac: 我听说(没有Mac要测试)发送菜单命令'hide:'可能有用。

这在Linux和Windows上均适用:

hide() {
    this.window.minimize();
    this.window.hide();
}

show() {
    this.window.show();
    this.window.restore();
}

答案 3 :(得分:-1)

感谢您的解决方案。这部分解决了我的用例,但不能完全解决。

提供的解决方案使您可以显示一个弹出窗口,然后切换回上一个应用程序,同时关闭该弹出窗口。

或者,如果您在屏幕的左半部分有其他应用程序,并且电子窗口在屏幕的右手侧。如果某个事件触发,并且您将注意力集中在电子应用程序上,则效果很好。但是,一旦完成并想将焦点返回到屏幕右侧的另一个应用程序,此解决方案以及浏览器窗口和应用程序级别上的其他模糊和隐藏组合似乎就无法正常工作。发生的情况是,如果电子窗口后面有第三个应用程序窗口,则即使先前可见但没有聚焦,电子窗口也将被发送回去。

是否有一种方法可以模糊应用程序,将焦点返回到先前的应用程序,而不隐藏电子浏览器窗口(如果已经可见)?