motorcross
Goto Top

VBS GoTo funktioniert nicht

Hallo Administratoren,

ich programmiere gerade einen VBS Script, der ein Fenster in den Fordergrund stellt und dann eine Tastatureingabe simuliert.
Dies möchte ich in einer Schleife haben das sieht so aus:
set WshShell = CreateObject("WScript.Shell")  
anfang:
WScript.Sleep 180000
WshShell.AppActivate "ProfiLab"  
WshShell.SendKeys "{ENTER}"  
GoTo anfang
Ich weiß aber nicht wo der Fehler liegt.
Der Error befindet sich in der 6. Zeile, 1. Zeichen
Hätte jemand eine Idee?
Gruß Motorcross

Content-Key: 141276

Url: https://administrator.de/contentid/141276

Ausgedruckt am: 28.03.2024 um 10:03 Uhr

Mitglied: Snowman25
Snowman25 22.04.2010 um 17:10:08 Uhr
Goto Top
es gibt kein Goto in VBS, allerdings könntest du es so lösen:


set WshShell = CreateObject("WScript.Shell")  
Do While TRUE
	WScript.Sleep 180000
	WshShell.AppActivate "ProfiLab"  
	WshShell.SendKeys "{ENTER}"  
loop
Mitglied: ChrFriedel
ChrFriedel 22.04.2010 um 17:52:50 Uhr
Goto Top
Hiho,

also diese Lösung finde ich nicht so gelungen da Sie eine Endlosschleife erzeugt die man nur mittels Taskmanager killen kann...
Wie wärs mit so einer Lösung?

set WshShell = WScript.CreateObject("WScript.Shell")  

windowName = "Server ist ausgelastet"          'Hier muss der Titel des Fenster eingetragen werden an den der Tastendruck gesendet werden soll. Titel! also Titelleiste :)  
choice = MsgBox ("Mit OK starten")  

answer  = 0
counter = 0
while answer <> 6	
	result = false
	result = WshShell.AppActivate (windowName)   'Hier wird versucht ein Fenster mit diesem Namen zu finden und zu fokussieren  

	if result = true then 
                'Send "{TAB}"  eventuell benötigt um bei einem aufgehenden Fenster die Standardantwort durchzuschalten. bspw von No auf YES  
		Send "{ENTER}"  
		counter = counter + 1
	end if

	answer = WshShell.Popup("Sendkey beenden?" & vbcrlf & vbcrlf & "Bisherige Treffer: " & counter,3, "Frage", 4 + 32)  
	WScript.Sleep 1000
wend

msgbox "Sendkey beendet"  

sub Send (sendString)
	WScript.Sleep 100
	WshShell.SendKeys sendString
end sub


Die Lösung macht sichtbar das das Script läuft, es lässt sich beenden, es schickt die Tasten nur an ein fest definiertes Fenster und zeigt die Anzahl der erfolgreichen Versuche.

Der Nachteil ist allerdings das nebenbei nicht am PC gearbeitet werden kann, aber ich vermute mal du brauchst das aus dem Grund um den PC unbeobachtet eine Aufgabe ausführen zu lassen die gelegentlich ne Frage stellt und auf eine Benutzereingabe wartet. Wenn ja sollte das genau das richtige für dich sein ;)

grüße
Mitglied: Snowman25
Snowman25 23.04.2010 um 09:38:13 Uhr
Goto Top
Hallo @ChrFriedel,

mit seinem eigenartigen GoTo-Konstrukt hätte @Motorcross auch eine Endlose Iteration erzeugt. Ich habe seien Code nur auf ein funktionierendes Level gebracht.
übrignes passen deine Sleep-Zeiten nicht mit den benötigten Werten zusammmen. Wozu überhaupt der Sleep nach der MsgBox?

Gruß
Snow
Mitglied: ChrFriedel
ChrFriedel 23.04.2010 um 09:54:17 Uhr
Goto Top
Huhu Snowman,

ich meinte auch nicht speziell deine Lösung sondern das ganze Prinzip. Bin gegen Endlosschleifen ;)

Der Sleep nach der Msgbox ist, zumindest bei Windows 7 und 1000ms, ein netter optischer Effekt da die Msgbox so langsam aus und dann wieder einblendet ;) Und wenn man dort höhere Werte verwendet kann man einstellen wie lange man vom nächsten Versuch verschont bleibt. Bspw 180000ms ;)

Grüße
Mitglied: Snowman25
Snowman25 23.04.2010 um 10:01:31 Uhr
Goto Top
Zitat von @ChrFriedel:
Der Sleep nach der Msgbox ist, zumindest bei Windows 7 und 1000ms, ein netter optischer Effekt da die Msgbox so langsam aus und
dann wieder einblendet face-wink
Jetzt bin ich neidisch... Ich musste mir dafür extra 'n FadeIn-/FadeOut-Schnipsel schreiben, damit das klappt (schleife mit opacity usw..). Problem dabei: Auf Rechnern mit schwacher GraKa bzw. ohne GraKa-treibern, wird das ganze auf einmal extrem langsam. Ausserdem ist Flüssigkeit und Geschwindigkeit des Effekts stark vom Rechner selbst abhängig...

Grüße
auch
Mitglied: ChrFriedel
ChrFriedel 23.04.2010 um 10:20:50 Uhr
Goto Top
Zitat von @Snowman25:
> Zitat von @ChrFriedel:
> ----
> Der Sleep nach der Msgbox ist, zumindest bei Windows 7 und 1000ms, ein netter optischer Effekt da die Msgbox so langsam aus
und
> dann wieder einblendet face-wink
Jetzt bin ich neidisch... Ich musste mir dafür extra 'n FadeIn-/FadeOut-Schnipsel schreiben, damit das klappt
(schleife mit opacity usw..). Problem dabei: Auf Rechnern mit schwacher GraKa bzw. ohne GraKa-treibern, wird das ganze auf
einmal extrem langsam. Ausserdem ist Flüssigkeit und Geschwindigkeit des Effekts stark vom Rechner selbst abhängig...

Haste das wirklich geschrieben? Mach doch mal ne neue Anleitung. Das würde ich mir mal anschauen...

btw das Zitieren könnte besser sein oder ;)
Mitglied: Snowman25
Snowman25 23.04.2010 um 10:55:30 Uhr
Goto Top
Zitat von @ChrFriedel:
Zitat von @Snowman25:
Zitat von @ChrFriedel:
Der Sleep nach der Msgbox ist, zumindest bei Windows 7 und 1000ms, ein netter optischer Effekt da die Msgbox so langsam
aus
und
dann wieder einblendet face-wink
Jetzt bin ich neidisch... Ich musste mir dafür extra 'n FadeIn-/FadeOut-Schnipsel schreiben, damit das klappt
(schleife mit opacity usw..). Problem dabei: Auf Rechnern mit schwacher GraKa bzw. ohne GraKa-treibern, wird das ganze
auf
einmal extrem langsam. Ausserdem ist Flüssigkeit und Geschwindigkeit des Effekts stark vom Rechner selbst
abhängig...

Haste das wirklich geschrieben? Mach doch mal ne neue Anleitung. Das würde ich mir mal anschauen...
Habs aber bloß in C#..
Siehe hier:
        private void fadein(object sender, EventArgs e) {
// als LOAD-Event der Form (bei Bedarf auch für Subforms und Dialoge)
            this.Opacity = 0;
            for (double i = 0; i < 100; i += 10) {
                this.Opacity = i / 100;
                this.Refresh();
            }
            this.Opacity = 1;
        }
        private void fadeout(object sender, EventArgs e) {
// als CLOSED-Event der Form (bei Bedarf auch für Subforms und Dialoge -> ohne Application.Exit)
            for (double i = 100; i > -1; i -= 10) {
                this.Opacity = i / 100;
                this.Refresh();
            }
            Application.Exit();
        }
Hab das projekt mal auf (ist nicht vollständig. Hatte bisher keine Lust, das Ding fertig zu machen.)

btw das Zitieren könnte besser sein oder ;)
:-P
Mitglied: ChrFriedel
ChrFriedel 23.04.2010 um 11:33:58 Uhr
Goto Top
Achso alles klar. Ich dachte in VBScript ;)

Aber ne lustige Spielerei ist es. Und auch viel cooler als der "Effekt" in meinem VBS. Aber ich kann mir vorstellen was du mit den Performanceproblemen meinst . Liegt vermutlich an den Refreshs. Aber wie man das umgehen kann weiß ich leider auch nicht so aus dem Stehgreif.. vielleicht irgendwas mit Buffern... oder du versucht es mit nem Timer der alle 20ms feuert und die opacity verändert und sich bei 1 abschaltet. Könnte sein das du damit die Refreshs umgehen kannst... alles aber ohne Garantie ;)
Mitglied: Snowman25
Snowman25 23.04.2010 um 11:39:59 Uhr
Goto Top
Hab ich schon alles ausprobiert. Aber das einzige, das zuverlässig funktioniert ist nunmal das. Auf diesem Rechner läuft der Effekt verdammt flüssig ab (frisch compiliert). Auf dem Laptop meiner mum (auch kein schlechtes Teil, allerdings vista) dauert der Effekt fast ewig. Kann aber auch am zusammenspiel des Effektes mit Aero liegen..

Hast du auch mal den Info-Screen geöffnet? Da kommt das am besten rüber, finde ich.

Gruß
Snow
Mitglied: ChrFriedel
ChrFriedel 23.04.2010 um 13:43:19 Uhr
Goto Top
Jo den hab auch probiert. Gelungen finde ich den Effekt auch face-smile Nur eben doof wenn er nicht flüssig läuft.

Bleibt wohl nur auf WPF und .net 3+ umzusteigen. Da wurde die Sache mit der Opacity nochmal überarbeitet glaube ich