Как определить, скрыто ли окно (cmd-h) и закрыто (cmd-w) - Mac - PullRequest
2 голосов
/ 05 февраля 2010

Я разрабатываю приложение AIR, которое использует несколько окон. Я сталкиваюсь с проблемой, когда я хочу открыть новые окна (например, уведомления тостера), когда основное окно приложения не видно, но поведение различается в зависимости от того, как окно закрыто.

Когда пользователь скрывает все окна приложений с помощью CMD-H, открытие нового окна приводит к тому, что все окна приложений возвращаются на передний план (а не просто это новое окно, как я ожидал). Однако если пользователь закрыл окно с помощью CMD-W, это окно не станет видимым при открытии нового окна.

Есть ли способ либо 1) определить, когда пользователь использует cmd-h, чтобы скрыть все окна, ИЛИ 2) определить, скрыто ли окно с использованием cmd-h или закрытого cmd-w?

Спасибо

1 Ответ

0 голосов
/ 12 февраля 2010

Я на самом деле только что нашел хороший ответ на эту проблему. Очевидно, что причина 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);
}

Спасибо за помощь в выяснении.

...