2017-02-23 2 views
0

のループではないウィンドウを閉じます。私たちがストレステストをしていて、これらのメッセージを無効にすることはできないので、今は多くの問題を引き起こしています。だから、誰かが絶えずプロセスに注目しなければなりません。私は、AppActivateSendKeysの機能を使用して、ポップアップメッセージをチェックして自動的に閉じるVBScriptを考え出しました。:AppActivateのは、私はそれがエラーが発生した場合、それがポップアップしますメッセージウィンドウと一時停止をユーザーが閉じる押されるまで、多くの場合、積極的に監視されずに実行する必要のあるアプリケーションを持っていますが、

問題は、私は、これは、ユーザーが簡単に始めることができるように/ GUI内で動作ボタンをクリックするだけで実行されているからコードを停止する必要があります。したがって、私は現在、VBScriptを単一のボタンでHTAアプリケーションにラップしていますが、何らかの理由でメッセージの最初のインスタンスを閉じることはありません(複数を同時にロードすることができます)。ボタン付き

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 

次のように:

私はそれだけで絶えず、バックグラウンドで実行「テストの失敗」ウィンドウが選択されている場合にのみ存在/ SendKeysを実行してできるようにする必要があり
<input type="button" value="Run Script" name="run_button" onClick="Testing"><p> 

を2番目のボタンを押すとループを停止します。

私は明らかに間違って何かを取得しています(VBScriptのは、それをしない、上から下へ実行しますか?)と私は本当に前に、これらの機能をいじったことがありません、すべてが正しくセットアップされているようです。


@Ansgar Wiechersには、問題の根本的な原因を解決したように正しい答えが付けられました。私が結んだ最後のコードは2つの部分に分かれていました。アプリケーション:

<!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> 

とサポートのVBScriptファイル:

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

答えて

0

あなたの手順は、遅滞なく50回の反復を行っているので、それも第二のインスタンスに得ることができる前に、それはおそらく既に終了しています。あなたが正常に小さな遅延で無限ループにAppActivateSendKeysを実行しているんだろう。

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

入れ、あなたのHTAから非同期で実行するスクリプトであること:

<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> 

あなたを必要とした場合その場でHTAから外部スクリプトを作成することができます。

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 

と終了後の後にそれを削除します。

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

ありがとうございました!私はそれがおそらく事実であると考えていましたが、ウィンドウの2つのインスタンスを開き、より大きなカウント値を持つことでテストしましたが、それでもまだ動作していませんでした。 私はあなたの提案を試してみました。私の唯一の問題は、スクリプトを「停止」するときに、「Invalid Window handle」と表示し、この行を指すエラーメッセージ「cmd.Terminate」が表示されることです。助言がありますか?私はそれを試してみると、遊び続けて更新されます。 – GnorthernGnome

+0

@GnorthernGnome外部スクリプトを終了した後に 'cmd'を' Nothing'に設定する必要があります。更新された回答をご覧ください。それでも問題が解決しない場合は、質問を編集して修正コードを表示してください。 –

+0

遅延のためのお詫び、突然プロジェクトがしばらくの間退屈になった。それが価値あるものであれば、 'cmd'を 'Nothing'に設定しても機能しませんでしたが、解決策を見つけることができました。私は元の投稿を興味のある人の最終的なコードで更新しました。ご協力いただきありがとうございます。 – GnorthernGnome

関連する問題