Fenster von Anwendungen mit LSUIElement=1

  • Fenster von Anwendungen mit LSUIElement=1

    Hallo Leute,

    ich habe folgendes Problem. Meine Anwendung ist nur über ein Icon un der MenuBar
    zugänglich. Ich habe dazu LSUIElement auf 1 gesetzt. Wenn ich jetzt aber ein Fenster
    (z.B. für die Einstellungen) öffnen will, dann erscheint das immer hinter allen anderen
    offenen fenstern. Das liegt sicherlich daran, das meine Anwendung nicht im Vordergrund ist.
    Ich habe dazu auch schon folgenden Thread gelesen:
    Dialog von "unsichtbarer" Applikation

    Leider funktionieren die Vorschläge nicht. Wie kann ich also einem Fenster
    sagen, dass es vor allen anderen erscheinen soll? Oder muss ich meine Anwendung
    zur Vordergrund-App machen, bevor ich ein Fenster anzeige? Wenn ja, wie mache ich das?

    Vielen Dank schon mal für euere Hinweise!
  • RE: Fenster von Anwendungen mit LSUIElement=1

    Die beste Strategie hängt sicherlich von der konkreten Art des Fensters ab (normales Fenster? Panel? Dialog? Modal? Keyboard-Fokus? Durchschnittliche Lebensdauer? Größe? Verwendung?) Eine LSUIElement-Applikation in den Vordergrund zu holen könnte beim Benutzer für Verwirrung sorgen. Ich würde es erstmal versuchen, dem Fenster per setLevel: ein höheres WindowLevel zu geben. Meines Wisens muss das gemacht werden, _bevor_ das Fenster zum ersten Mal auf dem Bildschirm erscheint, sonst funktioniert es nicht. Oder mit dem, was LongW vorgeschlagen hat.
    Multigrad - 360°-Produktfotografie für den Mac
  • Hallo,

    danke erstmal für euere schnellen Antworten. Leider funktionieren euere Vorschläge nicht
    (oder ich hab was falsch gemacht). Ich habe meiner Anwendung mal ein NSPanel hinzugefügt,
    dass gleichzeitig mit einem der Fenster angezeigt wird. Ich sehe das Panel erst dann, wenn ich
    auch das Fenster auswähle, auch wenn floatPanel YES ist.
    Dem Fenster ein höheres Level zu geben funktioniert leider auch nicht. Ich habe das in awakeFromNib: gemacht - das müsste ja vor dem ersten anzeigen des Fensters sein.
  • Original von oddysseey
    es hilf auch, das hier vor dem Öffnen des Fensters einzugeben:

    [NSApp activateIgnoringOtherApplications:YES];
    oder so ähnlich.
    dann der fenster-öffnen code und dann sollte das gehn.


    Das scheint das Problem zu lösen, aber warum muss ich das vor dem öffnen des Fensters mache?
    Eigentlich sollte es doch reichen, das ein mal bei der initialisierung der Applikation aufzurufen (z.B. in der Methode applicationDidFinishLaunching:).
  • Original von mvarlik
    Leider funktionieren euere Vorschläge nicht
    (oder ich hab was falsch gemacht)

    Ohne Dir zu nahe treten zu wollen: Es sieht ganz nach letzterem aus. Ich habe hier eben mal einen Dreizeiler-Tester gebastelt, da klappt es wunderbar mit setLevel: (mittlerweile anscheinend auch nachdem das Fenster dargestellt wird). Kurze externe Testprojekte würde ich in solchen Fällen übrigens immer machen, um Fehler besser isolieren zu können. Ist evtl. Dein Verweis auf das Fenster (Outlet o.ä.) nicht richtig gesetzt?
    Multigrad - 360°-Produktfotografie für den Mac
  • Es sollte auch mit den anderen WindowLevels über dem normalen (NSNormalWindowLevel) gehen. NSScreenSaverWindowLevel ist eigentlich nicht das richtige - ich hatte es nur genommen, weil es mir als erstes in den Sinn kam. Hier klappt es auch mit NSFloatingWindowLevel, das passt m.E. besser (die Fenster könnten dann hinter einigen Dialogen und Inspektoren liegen, aber immer vor normalen Fenstern).
    Multigrad - 360°-Produktfotografie für den Mac
  • Bei einem Menulet-Programm kann man vielleicht auch ausnahmsweise so vorgehen: mit GetCurrentProcess Infos über die eigene Applikation holen und sich dann mit SetFrontProcess selbst in den Vordergrund holen? Das Klicken auf das Icon im Menü heíßt ja eigentlich: ich arbeite mit der dahinterliegenden Applikation. Falls diese dann Fenster öffnet, dann doch bitte im Vordergrund als FrontProcess...
  • Wenn es technisch klappt, mag das in bestimmten Situationen sicherlich sinnvoll sein - wo wäre der Unterschied zu dem Weg, den odyssey beschrieben hat [NSApp activate... ] ? Die richtige Entscheidung ist m.E. nicht technisch zu begründen, sondern aus Usability-Erwägungen: Eine Anwednung, die längeres explizites Arbeiten im Vordergrund erlaubt, sollte sie sich im Dock zeigen. Nicht weil es notwendig wäre, sondern um ein Good Citizen in OSX zu sein - das erwarten Benutzer. Was das erwartungskonformste bzw. eleganteste Verhalten ist, muss jeder im Einzelfall klären. Da gibt's viele brauchbarer Wege. Manchmal muss man auch mit Konventionen brechen, falls das die Art der Anwendung nahe legt - ich muss da gerade an Snapz Pro denken, dessen Interaktion ist zwar auf den ersten Blick etwas verwirrend, aber im Endeffekt ganz elegant gelöst...
    Multigrad - 360°-Produktfotografie für den Mac