Gewinnt den Hintergrund-App-Fokus für den Dialog

9

Ich arbeite an einer kleinen Mac-Anwendung, die normalerweise unsichtbar im Hintergrund läuft. Die primäre Funktionalität der App kommt jedoch zum Tragen, wenn der Benutzer eine Datei auf dem Desktop oder anderswo im Finder umbenennt. In diesem Fall möchte ich einen Dialog ähnlich dem anzeigen, der angezeigt wird, wenn ein Benutzer eine Dateierweiterung im Finder ändert. Da dies bedeuten würde, dass meine Anwendung den vordersten Fokus erhält (anstatt Finder), möchte ich den Finder als oberste Anwendung zurückgeben, wenn der Benutzer in meinem Dialog auf "OK" klickt.

Ich verwende derzeit Apples Funktion Process Manager SetFrontProcessWithOptions() , aber im folgenden Szenario habe ich Probleme:

  • Ein Benutzer öffnet ein Finder-Fenster irgendwo in seinem Arbeitsbereich
  • Der Benutzer klickt dann auf seinen Desktop und deaktiviert das Fenster.
  • Der Benutzer benennt eine Datei auf seinem Desktop um
  • Meine Anwendung veranlasst sich, mit SetFrontProcessWithOptions() zu fokussieren
  • Der Nutzer trifft OK im Dialog, meine App fokussiert Finder mit SetFrontProcessWithOptions()
  • Wenn der Finder sich neu fokussiert, fokussiert er das Fenster, das der Benutzer zuvor geöffnet hatte, trotz der Tatsache, dass es nicht fokussiert war, als der Finder zuvor ganz vorne war.

Das wird sehr ärgerlich, wenn Sie ein Finder-Fenster in einem anderen Bereich geöffnet haben, bevor Sie eine Datei auf Ihrem Desktop umbenennen: In diesem Fall wird der Finder automatisch durch Klicken auf "OK" zwischen Leerzeichen und Fenster wechseln.

Dies liegt nur an der Art der Funktion SetFrontProcessWithOptions() , die nur ein Fenster einer bestimmten Anwendung fokussieren kann. Da der Desktop anscheinend nicht als Fenster zählt, findet die Funktion stattdessen ein anderes Fenster zum Fokussieren, obwohl der Benutzer dieses Fenster zuvor nicht fokussiert hatte.

Es wäre großartig, wenn jemand bessere Ideen dafür hätte, wie man eine Art dialogbasiertes Ding wie dieses macht, vielleicht sogar ohne den Fokus zu fokussieren und den Finder überhaupt nicht zu fokussieren.

BEARBEITEN : Ich habe einen etwas hässlichen Weg gefunden, um dieses Verhalten größtenteils zu beheben, aber es handelt sich um die Scripting Bridge, und der Desktop wird nicht neu fokussiert, wenn ein Objekt von es wurde umbenannt. Hier ist mein Code dafür:

%Vor%     
Alex Nichol 08.06.2012, 14:29
quelle

3 Antworten

2

Haben Sie in Erwägung gezogen, einfach -[NSApp hide:nil] aufzurufen? Das bedeutet, dass sich das System Gedanken darüber machen muss, wie die zuvor aktive App reaktiviert werden kann, und vergewissern Sie sich, dass Ihre App nicht mehr aktiv ist.

Übrigens ist das Verhalten, das Sie beobachtet haben, wo der Finder ein Fenster anstelle des Desktops aktiviert, wenn er den aktiven Status empfängt, der gleiche wie der, wenn Sie Command-Tab weg und dann zurück schalten. Oder Command-Tab entfernt und dann die Anwendung ausblenden, zu der Sie gewechselt haben. So kann es als das richtige Verhalten betrachtet werden. Auf der anderen Seite, in meinen Tests, die Vordergrund-App ausgeblendet, wenn der Finder auf den Desktop fokussiert wurde, aber ein Fenster auf einem anderen Platz hat, wechselt nicht zu dem anderen Raum. Es macht, was Sie wollen: aktiviert den Finder mit dem Desktop fokussiert.

Schließlich ist -[NSRunningApplication activateWithOptions:] der moderne Ersatz für SetFrontProcessWithOptions() .

Wenn Sie nur das Äquivalent von

verwenden möchten %Vor%

von Objective-C sehe ich zwei Möglichkeiten. Zuerst mit der Scripting Bridge API:

%Vor%

(Ich nehme an, Sie haben bereits die Grundlagen der Verwendung der Scripting Bridge mit dem Finder abgedeckt. Wenn nicht, hat Apple eine ScriptingBridgeFinder-Beispiel . Aus irgendeinem Grund ist es in der Legacy-Dokumentation.)

Zweitens könnten Sie NSAppleScript :

verwenden %Vor%

Bei meinen Tests mit Snow Leopard funktionierte jedoch kein Ansatz, um mit dem Desktop auf den Finder zu wechseln. Aber auch dein AppleScript-Code wurde nicht vom AppleScript-Editor ausgeführt.

    
Ken Thomases 24.02.2013, 19:03
quelle
1

Alex 'Lösung funktioniert nicht, wenn es auf dem Desktop keine Auswahl gibt, fürchte ich. Stattdessen sollte dieses AppleScript zuverlässiger sein, um festzustellen, ob ein Fenster oder der Desktop den Fokus hatte:

%Vor%

Es wird den Pfad zum Desktop-Ordner zurückgeben, wenn es den Fokus hat.

Obwohl es immer noch zwei Probleme gibt:

  1. Wenn der Benutzer ein Fenster des Desktops geöffnet hat, gibt das obige Skript dieselben Informationen zurück. I.e. Man kann nicht zwischen dem Desktop und einem Fenster des Desktops mit dem Fokus unterscheiden. Wäre schön, wenn es auch dafür eine Lösung gäbe.
  2. Es gibt einen Fehler im Finder seit 10.7 (immer noch in 10.8.2 vorhanden und Apple bekannt (siehe Ссылка ) bewirkt, dass der Finder falsche Informationen über kürzlich geöffnete Fenster meldet, wodurch auch das obige Skript unzuverlässig wird.

Um den Desktop erneut zu wählen, habe ich die Lösung jetzt selbst gefunden:

%Vor%

Es gibt auch einen Thread auf MacScripter.net, in dem ich die Optionen ein bisschen genauer erkläre: Ссылка

    
Thomas Tempelmann 24.02.2013 09:47
quelle
0

Warum nicht das eigentliche Apple Script aufrufen:

%Vor%

Inhalt von FocusOnFinder.scpt

%Vor%

Wenn der Finder nicht läuft oder minimiert ist, gibt es keinen Effekt.

    
SAPLogix 25.02.2013 01:11
quelle

Tags und Links