2010-01-26 5 views
2

Существует сценарий VBScript (.vbs), который кто-то сделал здесь, в моей компании. Он открывает и закрывает определенное приложение, у этого приложения есть значок в трее, и каждый раз, когда он закрывается (убивает через консоль) приложение, значок в трее остается. Поэтому после одного или двух дней запуска скрипта миллионы значков приложения остаются на панели задач.Обновление Windows TaskBar с VBScript для Windows?

Есть ли инструкция в VBScript для окон, чтобы обновить панель задач и избавиться от этих значков?

Вот scrpit:

***************************************************************************************** 
' Progam Name: CheckConnection.vbs 
' Program Purpose: This script check for an internec connection, the program pings to some domains, 
'  wait some seconds (5 seconds) before the next try, if a domain is found, reset all counters, 
'  and wait secondsBeforeNextCheck seconds before next check 
'  If the programs raise nMaxRetriesBeforeStartProgram then kill the program that 
'  manage the connection and start it again. 
' Usage: This Script must be placed in ONE OF THE FOLLOWING PATHS 
' 1) Start --> All Programs --> Start Up 
' 2) HKLM\Software\Microsoft\Windows\CurrentVersion\Run 
' 3)HKCU\Software\Microsoft\Windows\CurrentVersion\Run 
' 4) Or you can create a task through: 
'  Start --> All Programs --> Accessories-->System Tools --> Scheduled Tasks--> Add Scheduled Task 
'  --> Follow the Wizard' 
' 5) The program VZAccess Manager.exe must be configured to autoconnect through 
'  Tools --> Preferences --> WWan --> Connect Options --> Automatically Connect (this must be checked) 
' 6) Also to autorefresh the ip the vzaccess manager.exe must be configured with an script when c onnect. 
' Author: Benito Lopez 
' Date: 06152009 
' Revision 1.1 : (11272009) -f was added to force the program VZAccess manager.exe to terminate. 
' ***************************************************************************************** 
Dim WshShell 
Set WshShell = WScript.CreateObject("WScript.Shell") 
Dim objfso, objfile 
Set objfso = CreateObject("Scripting.FileSystemObject") 
Dim secondsBeforeNextCheck 
Dim strDomains(6) 
Dim nMaxRetriesBeforeStartProgram 
Dim nCounterRetries 

Const ForReading=1, ForWriting=2, ForAppending=8 

strDomains (0) = "www.google.com" 
strDomains (1) = "www.yahoo.com" 
strDomains (2) = "www.chilpak.com" 
strDomains (3) = "www.microsoft.com" 
strDomains (4) = "www.flutec.com" 
strDomains (5) = "www.flutec.com.mx" 

strLogFilename = "c:\checkconnectionlog.log" 
filepinger = "c:\pingresult.log" 
nMaxRetriesBeforeStartProgram =5 
secondsBeforeNextCheck = 60000 
secondsBeforeNextTry = 15000 
secondsBeforeAppStart = 2000 
secondsAfterAppStart = 60000 

Call Main() 

Sub Main() 
    set objfile = objfso.OpenTextFile(strLogFilename, 8,True) 

    WHILE 1 
     nCounterRetries = 0 
     FOR i = 0 TO 5 STEP 1 
      'Check the connection status if zero, means 
      'There is no internet connection or the domain is down 
      If not IsThereInternetConnection(strDomains(i)) THEN 
       'Let suppose the domain is down, so we must try with the next domain 
       nCounterRetries = nCounterRetries + 1 
       IF nCounterRetries >= nMaxRetriesBeforeStartProgram THEN 
        'Close the program 
        targetprogram = "taskkill /im " & chr(34) & "VZAccess Manager.exe" & chr(34) & " /f" 
        WshShell.Exec(targetprogram) 
        'Wait Applications Events 2 seconds 
        Wscript.Sleep(secondsBeforeAppStart) 
        'Start the program 
        targetprogram = chr(34) & "C:\Program Files\Verizon Wireless\VZAccess Manager\VZAccess Manager.exe" & chr(34) & " -m" 
        WshShell.Exec(targetprogram) 
        'Wait for the applications loads completely 1 seconds 
        WScript.Sleep(secondsAfterAppStart) 
        'Reset the counters 
        nCounterRetries = 0 
        Wscript.Sleep secondsBeforeNextCheck 
       END IF 
       'But we must wait some seconds before the next try 
       Wscript.Sleep secondsBeforeNextTry 

      ELSE 
       'If we get a reply from the current domain, 
       'Everything is OK, The only we need to do is Wait until the next time to check 
       'Reset Counter 
       nCounterRetries = 0 
       WScript.Sleep secondsBeforeNextCheck 
      END IF 
     NEXT 
    Wend 
End Sub 

FUNCTION IsThereInternetConnection(strDomain) 
on error resume next 
    'Create some cons values 
    'Make the ping 
    Dim strRun 
    strRun = "%comspec% /c ping -n 1 " & strDomain & " > " & filepinger 
    Dim objwss 
    Set objwss = CreateObject("WScript.Shell") 
    'Hide the windows and wait the app to terminate 
    WriteLog "Pinging " & strDomain & " ..." 
    objwss.Run strRun,0,True 
    Set objwss = Nothing 

    ''Read the ping 
    Dim strotf 
    Dim fso 
    Dim otf 
    strotf="" 
    set fso = CreateObject("Scripting.FileSystemObject") 
    set otf = fso.OpenTextFile(filepinger,ForReading) 
    strotf = otf.ReadAll 
    fso.DeleteFile filepinger 
    set fso = nothing 
    set otf = nothing 

    'Test the ping 
    IF InStr(strotf,"Reply from")>0 THEN 
     IsThereInternetConnection = TRUE 
    ELSE 
     IsThereInternetConnection = FALSE 
    END IF 
    WriteLog "Pinging Result " & IsThereInternetConnection & " Done." 
End FUNCTION 

Sub WriteLog(strLog) 

    on error resume next 

    Set objfile = objfso.GetFolder(strLogFilename) 
    if objfile.size > 50000 then 
     objfso.Close 
     objfso.DeleteFile strLogFilename 
     set objfile = objfso.OpenTextFile(strLogFilename, 8,True) 
    end if 
    'Add some useful information 
    strData = Now() & " - " 
    objfile.WriteLine strData & strLog 
End Sub 

ответ

1

Сирота иконки в системном трее уйти после того, как вы перемещаете указатель мыши над ними. Я думаю, это можно сделать программно, отправив сообщение WM_MOUSEMOVE в окно системного трея, но VBScript не имеет доступа к Windows API.

Я предлагаю вам использовать внешнюю утилиту, которая обновляет системный трей и запускает его из вашего скрипта. Например, в CodeProject есть утилита TrayIconBuster, которая может очищать лоток каждые 5 секунд. (Но для этого требуется .NET Framework.) Или вы можете написать аналогичный инструмент самостоятельно.

Для запуска приложения из кода VBScript вы можете использовать метод WshShell.Run или WshShell.Exec. Вы можете найти примеры в своем скрипте.

1

использовать VB, чтобы вызвать битой файл с помощью команды перезапуска проводника внутри или рег файл

редактор системного реестра Windows версии 5.00 [-HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ TrayNotify] [HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ Explorer \ TrayNotify]

0

Программы говорят проводнику, чтобы надеть или снять значок. Если вы взаимодействуете с значком Explorer, он пытается сказать программе что-то делать, и замечает, что ее нет, и удаляет значок.

Taskkill может делать две вещи. Он может попросить программу закрыть (программа может установить диалог «Сохранить файл?» - «Да/Нет/Отменить»), и программа выключится, как она была разработана или использована с /f, она завершает программу без уведомления о программе, поэтому программа не может попросить Explorer удалить значок.

Попробуйте Taskkill без переключателя /f. Вы всегда можете позвонить дважды, а затем с помощью переключателя /f.

Смежные вопросы