Сделайте .vbs, работающий в фоновом режиме, видимым, чтобы его можно было отменить.

Вопрос или проблема

У меня есть .vbs-скрипт, который бесконечно работает в фоновом режиме. Этот скрипт не имеет возможности взаимодействия с пользователем; обычный пользователь даже не заметит, что что-то работает в фоне. Теперь мне нужно иметь возможность завершить этот скрипт в любое время.

Итак, я ищу самый простой способ отменить этот .vbs-скрипт, не используя Диспетчер задач, другие инструменты или дополнительные скрипты, и не вводя что-то вроде этого в PowerShell или командной строке:

PowerShell: Stop-Process -Name wscript
Командная строка: Taskkill /IM wscript

Я попробовал запустить .cmd-скрипт, который просто запускает .vbs-скрипт. Я надеялся, что смогу завершить .vbs-скрипт вместе с .cmd, либо нажав CTRL+C, либо закрыв командную строку, но я протестировал это, и это не сработало.

Поэтому я немного погуглил и узнал, что можно создать видимый значок в области уведомлений для работающего .vbs-скрипта, который позволит закрыть его при правом клике.
Но я не могу заставить это работать. Ниже вы можете увидеть код, который я пробовал.
Первые три строки — это для значка в области уведомлений, строки с четвертой по девятую — это сам скрипт, который работает в фоновом режиме:

Public Declare Function Shell_NotifyIcon Lib "shell32" _
  Alias "Caffeinate" _
  (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Dim objResult
Set objShell = WScript.CreateObject("WScript.Shell")    
Do While True
  objResult = objShell.sendkeys("{NUMLOCK}{NUMLOCK}")
  Wscript.Sleep (6000)
Loop

Кто-нибудь знает, как использовать значок в области уведомлений для .vbs-скрипта?

В качестве альтернативы любой другой “простой в использовании” способ отменить такой .vbs-скрипт был бы очень хорош.

С наилучшими пожеланиями,

Кевин

@ZevSpitz Ваш совет отлично работает, спасибо еще раз. 😀

Теперь я делаю это так:

  1. Структура файлов:
    1 Структура
  2. Код скрипта CaffeineWin.vbs:
    2 CaffeineWin.vbs
  3. Переименованные хосты скриптов cscript.exe и wscript.exe в соответствующих версиях Windows:
    3 переименованные версии хоста скриптов
  4. Содержимое ReadMe.txt.
    4 ReadMe.txt
    Спасибо всем за вашу помощь. 🙂

Ответ или решение

Для решения вашей задачи по созданию видимой иконки в системном трей для .vbs-скрипта, чтобы пользователи могли легко его остановить, вы можете воспользоваться следующими рекомендациями. Вам потребуется немного изменить исходный код вашего .vbs-скрипта, добавив функциональность для отображения иконки в трее и выполняя соответствующие действия при взаимодействии с ней.

Шаг 1: Создание иконки в системном трей

Для начала, вот пример кода, который создаёт иконку в трей и позволяет завершать скрипт при щелчке правой кнопкой мыши:

' Формат иконки в трей
Public Const NIM_ADD = &H0
Public Const NIM_DELETE = &H2
Public Const NIM_MODIFY = &H1
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONUP = &H205

Public Type NOTIFYICONDATA
    cbSize As Long
    hWnd As Long
    uID As Long
    uFlags As Long
    uCallbackMessage As Long
    hIcon As Long
    szTip As String * 64
    dwState As Long
    dwStateMask As Long
    dwVersion As Long
    szInfo As String * 256
    uTimeout As Long
    szInfoTitle As String * 64
    dwInfoFlags As Long
End Type

Dim NoteIcon As NOTIFYICONDATA
Dim objShell, RetVal

Set objShell = CreateObject("Shell.Application")
NoteIcon.cbSize = Len(NoteIcon)
NoteIcon.hWnd = WScript.Arguments(0)
NoteIcon.uID = 1
NoteIcon.uFlags = &H1
NoteIcon.szTip = "Скрипт активен"
NoteIcon.hIcon = LoadIcon(0, 32512) ' Это стандартная иконка
RetVal = Shell_NotifyIcon(NIM_ADD, NoteIcon)

' Зацикливание основного действия
Do While True
    objShell.SendKeys "{NUMLOCK}{NUMLOCK}"
    WScript.Sleep 6000
Loop

' Завершение работы
Sub Shutdown()
    RetVal = Shell_NotifyIcon(NIM_DELETE, NoteIcon)
    WScript.Quit
End Sub

' Установка обработчика при щелчке правой кнопкой мыши
Dim Event
Set Event = objShell.AppActivate("MyApp")
If Event Then
    MsgBox "Завершить скрипт?", vbYesNo, "Выход"
    If vbYes = MsgBoxResult Then 
        Shutdown()
    End If
End If

Шаг 2: Настройка иконки и работа со съедобной мышью

Вам необходимо будет реализовать обработку событий мыши. Поскольку VBScript не поддерживает многопоточность и прямой ввод событий мыши в стандартной комплектации, может потребоваться использование дополнительного инструментария или внешних библиотек, таких как User32.dll для управления событиями мыши и системным треем.

Шаг 3: Установка скрипта

  1. Создайте файл: Скопируйте вышеописанный код в текстовый файл и сохраните его с расширением .vbs, например, MyScript.vbs.

  2. Запуск скрипта: Запустите ваш .vbs-скрипт, и он создаст иконку в системном трее.

  3. Завершение скрипта: Щелкнув правой кнопкой мыши на иконку, пользователи смогут увидеть уведомление, предложение завершить скрипт.

Заключение

Использование иконки в системном трее для управления фоновым .vbs-скриптом значительно упрощает взаимодействие пользователя с процессом, обеспечивая моментальный доступ к управляющим функциям. Помните, что для полноценной работы с системными иконками и событиями может потребоваться подключение дополнительных библиотек или использование других языков программирования, таких как VB.NET или C#, которые обеспечивают более широкий доступ к Windows API.

Если у вас возникнут вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться. Удачи в реализации вашего проекта!

Оцените материал
Добавить комментарий

Капча загружается...