Ich habe eine Anwendung, die oft ausgeführt werden muss, ohne aktiv überwacht zu werden, aber wenn es einen Fehler entdeckt, wird es ein Meldungsfenster öffnen und anhalten, bis ein Benutzer geschlossen hat. Es verursacht derzeit viele Probleme, da wir Stresstests durchführen und diese Nachrichten nicht deaktivieren können. Daher muss jemand ständig den Prozess im Auge behalten. Ich habe versucht, ein VBScript zu erstellen, das nach der Popup-Nachricht sucht und sie automatisch schließt, indem es die Funktionen AppActivate
und verwendet.AppActivate zum Schließen des Fensters nicht Looping
Das Problem ist, ich brauche dies innerhalb einer GUI zu arbeiten, so dass der Benutzer den Code auf Knopfdruck starten/stoppen kann. Ich habe daher derzeit mein VBScript in eine HTA-Anwendung mit einer einzigen Schaltfläche eingewickelt, aber aus irgendeinem Grund wird es immer nur die erste Instanz der Nachricht schließen (mehrere können gleichzeitig geladen werden) und stoppt dann.
Sub Testing
Set objShell = CreateObject("WScript.Shell")
counter = 1
Do While counter < 50
ret = objShell.AppActivate("Test Failure")
counter = counter + 1
If ret = True Then
objShell.SendKeys "~"
End If
Loop
End Sub
Mit einer Taste wie folgt:
<input type="button" value="Run Script" name="run_button" onClick="Testing"><p>
Ich brauche es nur ständig im Hintergrund laufen zu lassen, nur die SendKeys
ausführt, wenn die „Test Failure“ Fenster ausgewählt ist/Gegenwart und der Lage sein, Stoppen Sie die Schleife, wenn Sie eine zweite Taste drücken.
Ich bekomme eindeutig etwas falsch (VBScript führt von oben nach unten, nicht wahr?) Und ich habe nie wirklich mit diesen Funktionen herum gespielt, aber es scheint alles richtig eingerichtet zu sein.
Ich habe @Ansgar Wiechers Antwort als richtig markiert, da es die Ursache meines Problems gelöst hat. Der endgültige Code, mit dem ich endete, bestand aus zwei Teilen. Die Anwendung:
<!doctype html>
<head>
<hta:application
id="AutoCloseFailures"
applicationname="AutoCloseFailures"
icon=""
singleinstance="yes"
border="thick"
borderstyle="complex"
scroll="no"
maximizebutton="no"
version="0.1" />
<title>Auto-Close Failure Messages</title>
<meta http-equiv="x-ua-compatible" content="ie=8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<script language="VBScript">
' Set Global Variables for Subroutines
script = "#FOLDERPATH#\AutoCloseDEFXErrorsTimer.vbs"
Set sh = CreateObject("WScript.Shell")
Set cmdTest = Nothing
strVar = "testing2"
Sub StartLoop
' Initiate VB Loop to Target Failure Windows & Close Them
If cmdTest Is Nothing Then
Set cmdTest = sh.Exec("wscript.exe """ & script & """")
strVar = "testing"
End If
document.all.start.style.background="#777d84"
document.all.start.style.color="#bfc4c9"
End Sub
Sub StopLoop
' Terminate VB Loop Process & Reset Application
strScriptToKill = "AutoCloseDEFXErrorsTimer.vbs"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcess = objWMIService.ExecQuery (_
"Select * from Win32_Process " & _
"WHERE (Name = 'cscript.exe' OR Name = 'wscript.exe') " & _
"AND Commandline LIKE '%"& strScriptToKill &"%'" _
)
For Each objProcess in colProcess
objProcess.Terminate()
Next
Set cmdTest = Nothing
document.all.start.style.background="#587286"
document.all.start.style.color="#ffffff"
End Sub
Sub Window_onLoad
' Force Window Size
window.resizeTo 400,190
window.moveTo 1530, 0
End Sub
</script>
<style>
body {
margin: 0;
padding: 0;
font-family: "Segoe UI", Geneva, sans-serif;
background: #dae3f2;
}
h1 {
font-size: 15pt;
text-align: center;
margin-bottom: 0;
color: #273754;
}
button {
padding:16px 32px;
font-family:helvetica;
font-size:16px;
font-weight:100;
color:#fff;
background: #587286;
border:0;
}
button:hover {
background: #3B5C76;
}
.container {
width: 100%;
text-align: center;
}
</style>
<BODY>
<h1>Auto-Close Failure Messages</h1>
<br>
<div class="container">
<button id="start" onclick="StartLoop">Start</button>
<span> </span>
<button id="stop" onclick="StopLoop">Stop</button>
</div>
<br>
</BODY>
</HTML>
Und die Unterstützung vbScript Datei:
Set sh = CreateObject("WScript.Shell")
While True
active = sh.AppActivate("#WINDOW TITLE#")
If active Then
sh.SendKeys "~"
End If
WScript.Sleep 100
Wend
Vielen Dank! Ich hatte mir gedacht, dass das vielleicht der Fall war, aber ich hatte es getestet, indem ich zwei Instanzen des Fensters geöffnet und einen viel größeren Zählwert hatte und es immer noch nicht funktioniert hatte ... denke, es war nicht groß genug! Ich habe gerade Ihren Vorschlag ausprobiert und es funktioniert viel besser. Mein einziges Problem ist, dass wenn ich das Skript "stoppe" bekomme ich eine Fehlermeldung mit dem Hinweis "Invalid Window handle" und zeige auf diese Zeile: 'cmd.Terminate'. Irgendwelche Vorschläge? Ich werde weiterspielen und aktualisiert, wenn ich es ausarbeite. – GnorthernGnome
@GnorthernGnome 'cmd' muss nach dem Beenden des externen Skripts auf' Nothing' gesetzt werden. Siehe aktualisierte Antwort. Wenn das nicht hilft, bearbeiten Sie Ihre Frage und zeigen Sie Ihren geänderten Code an. –
Entschuldigung für die Verspätung, Projekt wurde plötzlich für eine Weile benommen. Für das, was es wert ist, "cmd" auf "Nothing" zu setzen, hat nicht funktioniert, aber ich habe es geschafft, eine Lösung zu finden. Ich habe meinen ursprünglichen Beitrag mit dem endgültigen Code für alle Interessierten aktualisiert. Danke für Ihre Hilfe. – GnorthernGnome