如何检测窗口是否隐藏(cmd-h)与关闭(cmd-w) - Mac

时间:2010-02-04 23:07:14

标签: flex macos air

我正在开发一个使用多个窗口的AIR应用程序。当主应用程序窗口不可见时,我遇到了一个我想打开新窗口(例如烤面包机通知)的问题,但行为因窗口的关闭方式而异。

当用户使用CMD-H隐藏所有应用程序窗口时,打开一个新窗口会导致所有应用程序窗口返回到前台(而不是像我期望的那样只是那个新窗口)。但是,如果用户使用CMD-W关闭了窗口,则在打开新窗口时该窗口不会显示。

有没有办法要么1)告诉用户何时使用cmd-h隐藏所有窗口或2)使用cmd-h与封闭的cmd-w判断窗口是否隐藏?

由于

1 个答案:

答案 0 :(得分:0)

我实际上只是找到了解决这个问题的好方法。显然,原因 cmd-H和cmd-W不会触发keyDown事件,因为它们是由本机应用程序菜单捕获并停止的。

默认情况下,框架会将几个“普通”mac OS菜单选项放入AIR应用程序中 - 这些选项包括用于关闭窗口的cmd-w,用于隐藏的cmd-h以及复制/剪切/粘贴周围的快捷方式。为了避免默认行为,我删除了这些菜单选项或更改了它们的等效键(触发它们的快捷键组合)。

添加首选项快捷方式(cmd - ,),覆盖cmd-w,将cmd -w更改为cmd-shift-w以及覆盖cmd-h功能的代码如下所示:

if (NativeApplication.supportsMenu) {
    var prefItem:NativeMenuItem = new NativeMenuItem("Preferences...");
    prefItem.addEventListener(Event.SELECT, handlePreferencesMenuSelect);
    prefItem.keyEquivalent = ",";

    var closeItem:NativeMenuItem = new NativeMenuItem("Close Tab");
    closeItem.addEventListener(Event.SELECT, handleCloseTabMenuSelect);
    closeItem.keyEquivalent = "w";

    // Add the preferences option under the first menu
    // Also add a spacer line (like most other applications)
    // Also change the hide command to our own handler
    var baseMenu:NativeMenuItem = NativeMenuItem(NativeApplication.nativeApplication.menu.items[0]);
    baseMenu.submenu.addItemAt(new NativeMenuItem("", true), 1);
    baseMenu.submenu.addItemAt(prefItem, 2);
    for (var idx:String in baseMenu.submenu.items) {
        var menuItem:NativeMenuItem = baseMenu.submenu.items[idx]; 
        if (menuItem && menuItem.keyEquivalent == 'h' && menuItem.keyEquivalentModifiers.length == 1) {
            baseMenu.submenu.removeItemAt(int(idx));

            var hideItem:NativeMenuItem = new NativeMenuItem("Hide Application");
            hideItem.addEventListener(Event.SELECT, handleHideWindowSelect);
            hideItem.keyEquivalent = "h";
            baseMenu.submenu.addItemAt(hideItem, int(idx));
        }
    }

    // Set the close window shortcut to cmd+shift+w, instead of cmd+w
    var fileMenu:NativeMenuItem = NativeMenuItem(NativeApplication.nativeApplication.menu.items[1]);
    NativeMenuItem(fileMenu.submenu.getItemAt(0)).keyEquivalent = 'W';
    fileMenu.submenu.addItem(closeItem);
}

感谢帮助搞清楚。