11
votes

Casser une case à cocher Basculez l'icône Dock ON et OFF

Comment faire une case à cocher masquer l'icône de quai si elle a été vérifiée? J'ai fait une case à cocher Basculer un objet Menubar, mais comment le feriez-vous avec l'icône du quai? Vous recherchez un code pour le faire. Merci!


1 commentaires

Consultez mon commentaire à la même question Semblable: Stackoverflow.com/a/68057340/1418981 . Testé et fonctionne sur MacOS 11.


5 Réponses :


2
votes

Vous voudriez configurer votre application en tant que lsuielement, puis utiliser TransformProcessType pour activer l'icône de quai. L'application devra être relancée pour le changement à prendre effet. Voir le Boîte de recherche rapide Google pour un exemple.


2 commentaires

Ah je vois merci, pensez-vous que vous pourriez ajouter du code à votre réponse car j'avais un coup d'œil au projet Google, mais il y avait tant de fichiers que je ne pouvais pas voir ce qu'ils ont fait en réalité.


QsbapplicationDelegate.m lignes 223 - 228. Ils ont la préférence elle-même accrochée à un NsharddefaultScontroller. Ils tournent l'application dans une application de quai sur les lignes que j'ai mentionnées.



4
votes

(en postant comme une réponse car les commentaires ne disposent pas de formatage de code)

QSBApplicationDelegate.m: 223-228 P>

BOOL iconInDock = [[NSUserDefaults standardUserDefaults] boolForKey:kQSBIconInDockKey];
if (iconInDock) {
  ProcessSerialNumber psn = { 0, kCurrentProcess };
  TransformProcessType(&psn, kProcessTransformToForegroundApplication);
}


13 commentaires

Donc, si je mettez ce code dans mon délégué de l'application et connectez une case à cocher à un contrôleur d'utilisateur par défaut. Est-ce que ça marchera?


Merci pour l'aide, j'ai juste essayé de mettre le code mais j'ai eu plusieurs erreurs. Voici une photo snapplr.com/jckq .


Vous devez inclure les bons en-têtes (regardez les docs pour TransformProcessType), utilisez vos propres préférences plutôt que d'une constante du projet QSB et faites votre application un lsuielement dans son plist.


Comment ferais-je l'application un lsuielement dans le plist?


Ajoutez une entrée dans votre fichier info.Plist dans lequel la clé est "LSUILELement" et la valeur est une case à cocher booléenne qui a été vérifiée. Xcode vous donnera une fenêtre contextuelle automatique avec des descriptions en anglais de la clé. "Lsuielement" correspond à "l'application est agent (uielement)"


Je l'ai fait, mais je reçois toujours ces erreurs ( snapplr.com/nqec ). Quel code dois-je ajouter pour le faire fonctionner? En outre, le code de votre réponse doit-il être dans une action afin que je puisse connecter l'action à la case à cocher?


@Joshua "kqsbiconindock" est une constante définie par le projet QSB et vous n'avez toujours pas importé les en-têtes qui définissent TransformProcessType. En bref, vous n'avez pas lu le commentaire de @ Smorgan. =)


Oh désolé, je n'ai pas vu ce commentaire. J'ai regardé les docs mais je ne suis pas sûr de ce que je devrais mettre. Est-ce quelque chose comme '#import processus.h'?


Comment importer les en-têtes?


Comment importer les en-têtes?


@Joshua regarde dans les docs pour TransformProcessType. Notez qu'au sommet de la documentation, il est indiqué "Cadre: ". Cela signifie que vous devez relier la structure carbone dans votre application, puis #import


Il suffit de mettre cette ligne de code dans mais qu'il ne semble rien changer. Voici une photo de snapplr.com/zgmf .


Comment se fait-il que je reçois toujours ces erreurs même si j'ai importé les cadres appropriés?



9
votes

J'ai utilisé ce code:

BOOL iconInDock = [[NSUserDefaults standardUserDefaults] boolForKey:smHideShowIcon];
if (iconInDock) {
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    // display dock icon
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
}


9 commentaires

N'est-ce pas exactement la même chose que le code dans l'autre réponse?


Pourquoi est-ce que je reçois ces erreurs même lorsque j'ai importé les cadres?


pursor.com/wp-content/uploads/2009/07/ Joshua.zip Il est archive du projet avec un exemple de travail montrant. Essayez cela et d'envoyer le résultat


Merci! Je dois que cela fonctionne bien que lorsque mon application est lsuielement, il n'y a aucun moyen d'accéder à la fenêtre Préférences pour modifier les paramètres afin que les gens puissent en faire une application normale, c'est parce que ce n'est jamais dans la menu-ménabère, il a toujours le Nom d'une autre application. Comment l'obtiendrais-je pour montrer à la menubre afin que les gens puissent réellement changer l'application à une application normale? Par exemple. snapplr.com/93mm L'application est la fenêtre dans le coin inférieur, elle est sélectionnée, mais il affiche toujours le Finder comme sélectionné app. Aussi ce qui est impair depuis que j'ai entré ce code, je ne peux pas taper 'a' lorsque l'application est ouverte.


Oui, je vois. Ajouter ce code après TransformProcessType ... Ça marche;) // Switch to Dock.app [[NsworkSpace SharedWorkspace] LaunchAppWithBundInIdInder: @ "com.apple.dock" Options: NSWORKSPACELAUNCHDEFAULT ADMINISTARAMDEScriptor: NIL LauningIdentifier: nil]; // retourne arrière [[NSAPPLICATION SharedApplication] ActivateInorCorApps: true];


Merci, je viens d'ajouter que, mais cela ne semble pas changer quoi que ce soit, savez-vous pourquoi?


Hmmm, je viens de vérifier - ça marche. Nouvelle version de joshua_1.1.zip Il pursor.com /wp-content/uploads/2009/07/joshua_1.1.zip Vérifiez ceci et faites une réponse. Est-ce que ça marche pour toi?


Je viens de vérifier et ça ne marche toujours pas, je sais pourquoi, parce que, parce que sur le deuxième projet, vous m'avez envoyé, il n'a pas été défini comme LSUILELement. Quand c'est dans le mien et le premier projet que vous m'avez envoyé.


Assurez-vous à votre fin sur la nouvelle application de test que vous avez envoyée est définie comme Lsuielement, s'il s'agit du lancement de l'application, il n'y aura pas d'icône de quai, le bouton Afficher doit fonctionner et vous ne verrez pas le nom des applications dans la menuGar. . Si ce n'est pas un lsuielement, tout fonctionnera comme une application normale et le bouton Afficher ne fera rien.



0
votes

Configurez votre application en tant que LSUIELement, puis appelez:

[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];


0 commentaires

12
votes

Mise à jour pour SWIFT, utilisez les deux manières a été présentée ci-dessus (elles donnent le même résultat):

public class func toggleDockIcon_Way1(showIcon state: Bool) -> Bool {
    // Get transform state.
    var transformState: ProcessApplicationTransformState
    if state {
        transformState = ProcessApplicationTransformState(kProcessTransformToForegroundApplication)
    }
    else {
        transformState = ProcessApplicationTransformState(kProcessTransformToUIElementApplication)
    }

    // Show / hide dock icon.
    var psn = ProcessSerialNumber(highLongOfPSN: 0, lowLongOfPSN: UInt32(kCurrentProcess))
    let transformStatus: OSStatus = TransformProcessType(&psn, transformState)
    return transformStatus == 0
}

public class func toggleDockIcon_Way2(showIcon state: Bool) -> Bool {
    var result: Bool
    if state {
        result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Regular)
    }
    else {
        result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Accessory)
    }
    return result
}


1 commentaires

Cacher l'icône avec ces méthodes cache également l'application elle-même. J'ai une minuterie qui le rend à nouveau (sans menu) mais c'est juste mauvais ux