Обновление Windows TaskBar с VBScript для Windows? - PullRequest
2 голосов
/ 26 января 2010

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

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

Вот сценарий:

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

Ответы [ 3 ]

2 голосов
/ 27 января 2010

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

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

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

1 голос
/ 28 сентября 2010

используйте vb для вызова файла bat с помощью команды restart Explorer внутри или reg файла

Редактор реестра Windows, версия 5.00 [-HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ TrayNotify] [HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ TrayNotify]

0 голосов
/ 30 апреля 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...