2011-05-26 4 views
0

J'ai écrit mon application applescript pour cacher la fenêtre de ma carte wifi. J'ai rencontré un problème en vérifiant si la fenêtre est visible ou non (pour éviter que la commande + h n'ait pas d'effet), j'ai donc décidé d'utiliser un delay 15 pour m'assurer (pas du tout) que la fenêtre s'ouvre. Si je lance le script depuis l'éditeur ou en double-cliquant sur le fichier de l'application, cela fonctionne, mais si je le configure pour démarrer à la connexion de l'utilisateur (sous Paramètres> Compte> Eléments de connexion), cela ne fonctionne pas! J'ai essayé de changer la case à cocher dans la page Save as... de l'éditeur d'applescript: J'ai essayé les deux réglages pour only execute, mais tout change. Avec l'option start screen en fait cela fonctionne, mais il me demande une confirmation et je ne le veux pas (je préférerais appuyer sur cmd + h à la place). N'importe qui peut m'expliquer pourquoi j'ai ce problème?Applescript ne fonctionne pas sur le démarrage OSX

tell application "System Events" 
set progList to (name of every process) 
set cond to false 
repeat while cond is false 
    if (progList contains "WirelessUtilityCardbusPCI") is true then 
     delay 5 
     activate application "WirelessUtilityCardbusPCI.app" 
     tell application "System Events" to keystroke "h" using [command down] 
     set cond to true 
    else 
     delay 5 
     set progList to (name of every process) 
    end if 
end repeat 
end tell 

EDIT: Maintenant, cela semble fonctionner! J'ai oublié de répondre set progList to (name of every process). Maintenant, le code est correct.

+0

Besoin de voir le code. – regulus6633

+0

Je suis désolé, mais je ne pensais pas que le code puisse changer quelque chose. – Paciotti

Répondre

2

Je vois que votre code fonctionne. C'est génial. Cependant, je poste ceci pour vous aider à apprendre. Je vois quelques petits problèmes avec votre code. Par exemple, dans votre boucle de répétition, vous indiquez les événements système à la frappe "h". Il n'est pas nécessaire de dire aux événements système de le faire dans cette ligne car vous êtes déjà dans un bloc de code d'événements système, les événements système le savent déjà.

Voici comment j'écrirais votre code. Cela ne nécessite pas de frappe, ce qui est toujours une bonne chose, et est un peu plus efficace. Cela fonctionne parce que si le processus n'existe pas alors les erreurs de ligne "set theProcess to", le code passe alors dans la section "on error" pour retarder 5, alors la boucle repeat essaye de retrouver le processus. Si le processus est trouvé, il définit sa propriété visible qui est la même que la cacher.

Il dispose également d'un mécanisme de temporisation pour empêcher le script de s'exécuter pour toujours. Utilisez ceci si vous voulez. Bonne chance.

set processName to "WirelessUtilityCardbusPCI" 
set maxTime to 180 -- we only check for 3 minutes, then end 

set inTime to current date 
repeat 
    try 
     tell application "System Events" 
      set theProcess to first process whose name is processName 
      set visible of theProcess to false 
     end tell 
     exit repeat 
    on error 
     if (current date) - inTime is greater than maxTime then 
      tell me 
       activate 
       display dialog "The process " & processName & " could not be found!" buttons {"OK"} default button 1 with icon 0 
      end tell 
      exit repeat 
     end if 
     delay 5 
    end try 
end repeat 

EDIT: J'ai vérifié le code ci-dessus en utilisant l'application TextEdit et il fonctionne très bien. Pour le vérifier avec votre application, exécutez ce qui suit. Assurez-vous que l'application est en cours d'exécution lorsque vous exécutez ce code. S'il y a une erreur cela l'affichera. S'il n'y a pas d'erreur, 2 boîtes de dialogue s'afficheront indiquant la progression. Rapportez ce que vous trouvez.

set processName to "WirelessUtilityCardbusPCI" 

try 
    tell application "System Events" 
     set theProcess to first process whose name is processName 
     display dialog "I have found the process" 
     set visible of theProcess to false 
     display dialog "I just performed the \"set visible\" code" 
    end tell 
on error theError number errorNumber 
    tell me 
     activate 
     display dialog "There was an error: " & (errorNumber as text) & return & return & theError buttons {"OK"} default button 1 with icon stop 
     return 
    end tell 
end try 
+0

Que fait exactement le "premier"? Votre code est très intéressant, mais cela ne fonctionne pas: il se termine sans dialogue d'erreur ni en masquant l'application. Je pense que ce processus a un problème avec "set visible", mais cette fois ça ne me donne pas d'erreur (contrairement à mes précédentes tentatives)! – Paciotti

+0

J'ai ajouté du code dans la section EDIT ci-dessus pour vous aider à trouver le problème. Essayez-le et faites un rapport. – regulus6633

+0

Je ne sais pas pourquoi, mais "définir visible" ne fonctionne pas pour mon application! La deuxième boîte de dialogue apparaît, mais l'application est toujours visible. Et j'ai un autre problème: si je cherche le processus, parfois mon application s'exécute quand la fenêtre n'est pas encore dessinée. De cette façon, la touche cmd + h est exécutée sur rien et le script se termine sans effet. – Paciotti

0

J'ai utilisé les éléments de connexion pour lancer une applet AppleScript à la connexion avec succès, donc ma première suggestion est de m'assurer que c'est pas en cours d'exécution. Avoir une boîte de dialogue personnalisée ou un bip ou quelque chose comme ça pour confirmer si elle est en cours d'exécution ou non. À part ça, je ne suis pas sûr de savoir quelle suggestion offrir à moins que vous ne souhaitiez publier le code que vous exécutez dans le script.

Questions connexes