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:
SetFrontProcessWithOptions()
zu fokussieren
OK
im Dialog, meine App fokussiert Finder mit SetFrontProcessWithOptions()
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% 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
:
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.
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:
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: Ссылка
Tags und Links objective-c cocoa nswindow