App beenden, Parameter setzen und wieder starten?

ObiTobi

ObiTobi

Aktives Mitglied
Thread Starter
Dabei seit
05.11.2009
Beiträge
1.536
Reaktionspunkte
91
Hallo,

wie kriege ich so ein Konstrukt ans laufen?

Code:
if application "Digital Photo Professional" is running then
	tell the application "Digital Photo Professional" to quit
	do shell script "Setze Parameter"
tell the application "Digital Photo Professional" to activate
end if

Das Problem liegt an dem "activate". Zuerst wird geprüft ob die Applikation läuft, wenn ja soll sie beendet werden und Parameter gesetzt werden und anschliessend wieder gestertet werden.
Mir bringt also nichts wenn ich das activate außerhalb der "if" Abfrage setze, dann wurde die Anwendung immer gestertet werden und das will ich nicht.
Spontan dachte ich an irgendein Semaphor o.ä zu setzen den ich später abfragen und nach dem starten wieder löschen könnte, habe aber keine Ahnung ob bzw. wie so etwas in AppleScript geht.

Tobi
 
Ich habe dein Problem noch nicht so ganz verstanden. Ist es vielleicht so, dass das Programm schon gestartet wird, obwohl die Parameter noch nicht gesetzt sind?
 
Ja so kann man es auch sehen.
 
Das Problem bei AppleScript ist, dass nicht immer abgewartet wird bis ein shellscript fertig ausgeführt ist. Etwas wie Semphores gibt es unter AppleScript mWn. nicht, da es kein Multitasking gibt sondern alles Schritt für Schritt abgearbeitet wird.

Das einfachste ist also wahrscheinlich einfach ein delay zu setzen. Entweder du probierst einfach aus, wie lange das setzen der Parameter dauert oder du fragst ab, ob die Parameter gesetzt sind:

Code:
[FONT="Verdana"][size=2][b]repeat[/b] [b]until[/b] [color=#3F7F00]parameterGesetzt[/color] [b]is[/b] [color=#4A1E7F]true[/color]
	[color=#0016B0][b]delay[/b][/color] 0.1
[b]end[/b] [b]repeat[/b][/size][/FONT]
 
Das hilft mir aber nicht weiter.

Ich habe mir 2 Scripts gebaut wo ich Fenstergrößen und Position für alle meine Programme setze. Ein wenn ich mit dem Laptop Unterwegs bin und ein wenn ich zu Hause mein Ext Bildschirm angeschlossen habe. Bei Programmen die AppleScript verstehen ist das alles kein Problem weil man die Fensterposition und Größe on-the-fly verändern kann. Bei Programmen wie das DPP von Canon ist es leider nicht so. Hier muss das Programm beendet werden, dann kann die entsprechende plist Datei verändert werden und dann neu starten.
Das Programm ist nicht immer gestertet, deswegen mache ich zuerst die Prüfung "if application "Digital Photo Professional" is running". Wenn ja dann muss es erst beendet werden, dann kann ich die plist bearbeiten und dann soll es auch wieder neu gestartet werden.

Um das noch etwas "bildlicher" darzustellen. Ich bin mit dem Laptop Unterwegs und habe DPP gestartet. Jetzt komme ich nach Hause und schliesse mein Ext. Monitor an. Das DPP Fenster ist viel zu klein. Also entsprechend vergrößern. Mit der Maus ist das in meinen Augen auch umständlich.
Jetzt kommt es aber viel schlimmer ich trenne mein Ext. Bildschirm und das DPP Fenster ist aber viel zu groß und man braucht viel Zeit bis man das Fenster entsprechend angepasst hat.

Aus dem Grund hatte ich die Idee irgendwie so etwas zu machen:

Wenn Programm läuft:
- setze Marker "1"
- beende Programm
- setze Parameter
Abfrage Ende

Nächste Abfrage
Wenn Marker ist gleich "1" dann
- starte Programm
Ende Abfrage

Tobi
 
Die Fenstergröße lässt sich auch ändern, wenn das Programm läuft. Der Umweg über die Plist ist unnötig:

Code:
[FONT="Verdana"][size=2][b]tell[/b] [color=#0000FF][i]application[/i][/color] "System Events"
	[b]tell[/b] [color=#0000FF][i]process[/i][/color] "Digital Photo Professional"
		[b]set[/b] [color=#6C04D4]size[/color] [b]of[/b] [color=#0000FF][i]window[/i][/color] 1 [b]to[/b] {1024, 640} [color=#4C4D4D]-- minimum {1024, 640}[/color]
		[b]set[/b] [color=#6C04D4]position[/color] [b]of[/b] [color=#0000FF][i]window[/i][/color] 1 [b]to[/b] {0, 0}
	[b]end[/b] [b]tell[/b]
[b]end[/b] [b]tell[/b][/size][/FONT]

Abgesehen davon:

Es wäre möglich Daten auch nach dem Beenden eines Skriptes in einer Property zu speichern. Diese können aber immer nur vom gleichen Programm ausgelesen werden.
 
Das wusste ich nicht. So ist das natürlich viel einfacher und eleganter.
Vielen Dank.

Tobi
 
Tja, einige Tage war ich sehr zufrieden mit der Lösung. Dann habe ich mir wieder eine Applikation installiert die nichts von AppleScript versteht und das o.g funktioniert auch nicht.
Es geht um Corel AfterShot Pro (ist eine QT App).

Code:
if application "Corel AfterShot Pro" is running then
	tell application "System Events"
		tell process "Corel AfterShot Pro"
			set position of window 1 to {0, 0}
			set size of window 1 to {1915, 1275}
		end tell
	end tell
end if

Also Fehlermeldung kommt:
Code:
tell application "System Events"
	set position of window 1 of process "Corel AfterShot Pro" to {0, 0}
		--> error number -1728 from «class prcs» "Corel AfterShot Pro"
Ergebnis:
error "„System Events“ hat einen Fehler erhalten: „process \"Corel AfterShot Pro\"“ kann nicht als „{0, 0}“ gesetzt werden." number -10006 from process "Corel AfterShot Pro"

Idee wie ich das Programm in Griff bekomme?

Tobi
 
Ein kleines Stück weiter bin ich.
Die Applikation heisst zwar "Corel AftreShot Pro" das Prozess aber "AfterShotPro".
Nach der Änderung wird zwar die Position gesetzt aber "size" nicht. Es passiert einfach nichts :(

Tobi
 
Ich weiß nicht, ob es dir hilft. Aber du könntest es wie von dir oben beschrieben mit einem Shellscript machen. Dann das Programm aber nicht mit Applescript sondern eben in dem Shellscript erneut starten. Somit umgehst du das Problem, dass das Programm zu schnell wieder gestartet wird, bevor das Shellscript fertig ist.
 
Ja könnte ich machen die Frage ist nur wie.

Also vielleicht noch mal kurz die Problematik die ich lösen/ umgehen will.
Programm läuft. Ich arbeite am Laptop. Jetzt schlisse ich externes Schirm an. Programmfenster ist zu klein.

Lösung:
Programm beenden
Parameter setzen (Fenster Position und Größe ich entsprechende *.plist schreiben)
Programm starten

Realisierung:

Code:
if application "Corel AfterShot Pro" is running then

tell Application "Corel AfterShot Pro" to quit
do shell script "Parameter setzen"
end tell

Und das Problem jetzt - wie kriege ich die Anwendung wieder gestertet? Es soll ja auch NUR dann gestartet werden wenn es vorher schon lief!

Gruß Tobi
 
Im Shellscript kannst du das Programm ganz normal starten. z.B. iCal "/Applications/iCal.app/Contents/MacOS/iCal". Ggf. den Prozess noch in den Hintergrund schicken, damit das Shellscript nicht hängen bleibt.

Entweder du schreibst zwei Shellscripte, einmal eines, was das jeweilige Programm neu startet und eines, welches nur die Parameter setzt oder du übergibst einen Parameter, der angibt, ob das Programm bereits läuft, oder du machst die Abfrage, ob ein Programm läuft ebenfalls mit dem Shellscript.

Die Abfrage im Shellscript, ob ein Programm läuft geht z.B. so:
Hier gefunden: http://www.unixboard.de/vb3/showthread.php?18574-If-Abfrage-ob-sendmail-l%E4uft
Code:
if [ "$(ps ax|grep -i "[i]cal")" ]; then echo "läuft"; else echo "läuft nicht";fi
 
Zuletzt bearbeitet:
Also ich habe es jetzt doch mit AppleScript und Teil ShellScript gelöst.
So wie ich am Anfang gedacht habe, so habe ich es jetzt auch gemacht.

Code:
property ProgrammIsRunning : ""
set ProgrammIsRunning to 0
if application "Corel AfterShot Pro" is running then
	set ProgrammIsRunning to 1
	tell application "Corel AfterShot Pro" to quit
	delay 5
	do shell script "defaults write ~/Library/Preferences/com.corel.AfterShot\\ Pro MainWindow.Geometry \"<01d9d0cb 00010000 00000000 00000000 000009f5 00000598 00000000 0000002c 000009f5 00000598 00000000 0000>\""
end if
if ProgrammIsRunning is 1 then
	tell application "Corel AfterShot Pro" to activate
end if

Tobi
 
Zurück
Oben Unten