2017-02-23 1 views
0

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>&nbsp;&nbsp;&nbsp;</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 

Antwort

0

Ihre Prozedur tut 50 Wiederholungen ohne Verzögerung, so ist es wahrscheinlich schon fertig, bevor es sogar zu einer zweiten Instanz zu bekommen. Was würden Sie normalerweise tun, ist laufen AppActivate und SendKeys in einer Endlosschleife mit einer kleinen Verzögerung:

Set sh = CreateObject("WScript.Shell") 
While True 
    active = sh.AppActivate("Test Failure") 
    If active Then 
     sh.SendKeys "~" 
    End If 
    WScript.Sleep 100 
Wend 

setzte sich in einem Skript, das Sie asynchron von HTA laufen:

<html> 
<head> 
<title>sample</title> 
<HTA:APPLICATION 
    ID="sample" 
    APPLICATIONNAME="oHTA" 
    SINGLEINSTANCE="yes"> 

<script language="VBScript"> 
script = "C:\path\to\script.vbs" 
Set sh = CreateObject("WScript.Shell") 
Set cmd = Nothing 

Sub StartLoop 
    If cmd Is Nothing Then 
     Set cmd = sh.Exec("wscript.exe """ & script & """") 
    End If 
End Sub 

Sub StopLoop 
    If Not cmd Is Nothing Then 
     cmd.Terminate 
     Set cmd = Nothing 
    End If 
End Sub 
</script> 
</head> 

<body> 
<p> 
<button id="start" onclick="StartLoop">Start</button> 
<button id="stop" onclick="StopLoop">Stop</button> 
</p> 
</body> 
</html> 

Wenn Sie erforderlich kann im laufenden Betrieb des externen Skript aus der HTA erstellen:

Set fso = CreateObject("Scripting.FileSystemObject") 
... 
Set f = fso.OpenTextFile(script, 2, True) 
f.WriteLine "Set sh = CreateObject(""WScript.Shell"")" 
f.WriteLine "While True" 
f.WriteLine "active = sh.AppActivate(""Test Failure"")" 
... 
f.Close 

und es nach nach Beendigung löschen:

If Not cmd Is Nothing Then 
    cmd.Terminate 
    Set cmd = Nothing 
    fso.DeleteFile script, True 
End If 
+0

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

+0

@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. –

+0

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

Verwandte Themen