[Anfänger] Aktives Fenster verschieben

W

Wolfgang K.

Neues Mitglied
Thread Starter
Dabei seit
17.02.2005
Beiträge
13
Reaktionspunkte
0
Liebe Scriptprofis,

gibt es denn wirklich keine Möglichkeit, mit AppleScript die Position des momentan gerade aktiven Fensters zu verändern? Das Problem ist, dass das Fenster zu jeder beliebigen Anwendung gehören kann. Im Finder z.B. funktioniert das Verschieben mit "position" ja problemlos.

Ich suche jetzt wirklich schon lange, kann aber einfach nichts finden, vielleicht könnt ihr mir ja helfen.
 
Vielleicht muss man von AppleScript die Scriptaufrufe des jeweiligen Programms benutzen. Sofern die Programme diese Funktionsaufrufe zur Fensterposition unterstützen.
 
joachim14 schrieb:
Vielleicht muss man von AppleScript die Scriptaufrufe des jeweiligen Programms benutzen. Sofern die Programme diese Funktionsaufrufe zur Fensterposition unterstützen.

Ja, genau da liegt das Problem. Die momentan aktive Anwendung rufe ich mit "tell current application" auf, aber mir fehlt dann ein global gültiger "position"-Befehl, mit dem ich jede Anwendung ansprechen kann.
 
Code:
tell current application
	set bounds of window 1 to {200, 250, 300, 400}
end tell

Sollte funktionieren.

Grüße,
Flo
 
lengsel schrieb:
Code:
tell current application
	set bounds of window 1 to {200, 250, 300, 400}
end tell

Sollte funktionieren.

Grüße,
Flo

Danke für die Hilfe, das klappt bestens, solange ich es im Skripteditor selbst ausprobiere (auf "Run" klicke). Sobald ich das Skript aber speicher und eigenständig laufen lassen will kommt bei jeder Anwendung der Fehler "Can't set bounds of window 1 to...". Auch wenn ich es z.B. auf den Skripteditor anwende.
 
Auch wenn Du es als Programm (nur ausführen, kein Startdialog) speicherst?

Grüße,
Flo
 
lengsel schrieb:
Auch wenn Du es als Programm (nur ausführen, kein Startdialog) speicherst?

Grüße,
Flo

Ja, auch dann. Habs grad nochmal mit exakt dem von dir vorgeschlagenen Code probiert. Alle drei beim Speichern als Anwendung angebotenen Optionen führen in jeder Kombination leider immer zum gleichen Fehler :-(
 
Es scheint tatsächlich so zu sein dass die Programme "mit Namen" angesprochen werden wollen. So ist es zwar kein Problem z.B. so
Code:
set theApp to get name of current application
den Namen einer Anwendung zu substituieren, und dann z.B. statt
Code:
tell application "Name der Anwendung"
ein
Code:
tell application "theApp"
zu schreiben.
Hilft aber eben leider nichts. Denn wenn man dieses Skript aus dem Editor aufruft bezieht sich "current application" natürlich auf den Editor, speichert man es als Programm passiert auch nichts hilfreiches.
Alternativen wären eben das Programm "hardcoded" per Namen anzusprechen, oder per Liste aus allen aktuellen Anwendungen auswählen...

Ist vielleicht etwas verwirrend formuliert, aber ich bin leider gerade auf dem Sprung und etwas unkonzentriert...

Grüße,
Flo
 
lengsel schrieb:
Es scheint tatsächlich so zu sein dass die Programme "mit Namen" angesprochen werden wollen. So ist es zwar kein Problem z.B. so
Code:
set theApp to get name of current application
den Namen einer Anwendung zu substituieren, und dann z.B. statt
Code:
tell application "Name der Anwendung"
ein
Code:
tell application "theApp"
zu schreiben.
Hilft aber eben leider nichts. Denn wenn man dieses Skript aus dem Editor aufruft bezieht sich "current application" natürlich auf den Editor, speichert man es als Programm passiert auch nichts hilfreiches.
Diesen Weg hab ich mittlerweile auch schon ausprobiert, versteh aber nicht, wieso das nicht geht, lass ich mir den Programmstring vor der Übergabe ausgeben entspricht er ja exakt dem was ich normelerweise hinschreiben würde.
lengsel schrieb:
Alternativen wären eben das Programm "hardcoded" per Namen anzusprechen, oder per Liste aus allen aktuellen Anwendungen auswählen...

Ist vielleicht etwas verwirrend formuliert, aber ich bin leider gerade auf dem Sprung und etwas unkonzentriert...
Also mit "hardcoded" meinst du vermutlich, dass ich einfach jedes Programm extra im Skript anspreche? Dann müsste aber jedesmal wenn eine neue Anwendung hinzukommt das Skript angepasst werden?

Ich werde das Problem jedenfalls mal weiterverfolgen und posten, sobald ich was rausbekommen hab.

Grüße,
Wolfgang
 
Habe im Netz weitere Skripte gefunden, die auf "set bounds" basieren (z.B. Skript 1 oder Skript 2) aber beim sobald ich versuche die auszuführen kommt genau der gleiche Fehler.
 
in dem Moment, wo das Script gestartet wird ändert sich normalerweise* der Wert von current app, denn das script wird zum current object

Code:
-- als Programm speichern
display dialog class of current application as text

es geht daher eigentlich um den alten Wert von current application

Script als Programm-Bundle speichern und zur info.plist
Code:
<key>LSBackgroundOnly</key>
<string>1</string>
hinzufügen
Datei danach im Finder in anderen Ordner verschieben, damit Änderungen wirksam werden

das Script läuft so im Hintergrund und current app wird nicht verändert

zum Testen für Script Tastaturkürzel festlegen oder ins Dock ziehen

Code:
tell application "Finder" to set activeApp to name of every process whose frontmost is true

try
	tell application (activeApp as text) to set bounds of window 1 to {200, 250, 300, 400}
end try
 
w2lab schrieb:
Code:
tell application "Finder" to set activeApp to name of every process whose frontmost is true

try
	tell application (activeApp as text) to set bounds of window 1 to {200, 250, 300, 400}
end try

Danke vielmals für den Tipp, w2lab! Mit dem Beispiel funktioniert das bestens, aber weiß jemand, warum das gleiche Vorgehen hier nicht mehr funktioniert?

Code:
tell application "Finder" to set activeApp to name of every process whose frontmost is true

try
	set {x1, y1, x2, y2} to bounds of window 1
	tell application (activeApp as text) to set bounds of window 1 to {(x1 - 50), y1, (x2 - 50), y2}
end try

EDIT: Sorry, hab nur "tell application (activeApp as text) to" beim "set" vergessen, jetzt klappts.
 
Hi,

das Problem hatte ich auch. Als zukünftiger Windows-Switcher habe ich aber schon vorgesorgt und entsprechende Skripte geschrieben. Meine Skripte können das aktive Fenster
  • maximieren
  • zentrieren
  • in eine der vier Bildschirmecken bewegen
  • bis zum oberen, unteren, linken oder rechten Rand vergrößern
Die Skripte (spooky) startet man am Besten mit Butler oder QuickSilver per Hotkey. Mehr infos auf meiner noDesign Homepage http://www.doernte.net/software. Dort kann man die Skripte auch herunter laden.

Johannes Dörnte
 
JohannesDörnte schrieb:
Hi,

das Problem hatte ich auch. Als zukünftiger Windows-Switcher habe ich aber schon vorgesorgt und entsprechende Skripte geschrieben. Meine Skripte können das aktive Fenster
  • maximieren
  • zentrieren
  • in eine der vier Bildschirmecken bewegen
  • bis zum oberen, unteren, linken oder rechten Rand vergrößern
Die Skripte (spooky) startet man am Besten mit Butler oder QuickSilver per Hotkey. Mehr infos auf meiner noDesign Homepage http://www.doernte.net/software. Dort kann man die Skripte auch herunter laden.

Johannes Dörnte

Hallo Johannes,

Danke für den Hinweis, sehr interessante Skripte. Mein Skript soll ja etwas ganz Ähnliches machen - einfach per Shortcut Fenster von einem Monitor auf den anderen verschieben, würde auch gut in deine Sammlung passen. Es funktioniert merkwürdigerweise noch nicht mit allen Anwendungen (z.B. Adium, Skype, Activity Monitor), werde mal schaun wie du das alles so gelöst hast. Meine momentane Lösung:

Code:
tell application "Finder" to set activeApp to name of every process whose frontmost is true

set {disp1width, disp1Posx1, disp2Posx1} to {1920, 80, 1970}

try
	
	tell application (activeApp as text) to set {x1, y1, x2, y2} to bounds of window 1
	set winWidth to (x2 - x1)
	
	if x1 > disp1width then
		
		tell application (activeApp as text) to set bounds of window 1 to {disp1Posx1, y1, (disp1Posx1 + winWidth), y2}
	else
		tell application (activeApp as text) to set bounds of window 1 to {disp2Posx1, y1, (disp2Posx1 + winWidth), y2}
	end if
	
end try
 
Zurück
Oben Unten