1 (изменено: 3wedsmncjklvjvd73734, 2026-02-13 04:21:11)

Тема: WSH,VBS,JS: VB.NET (Framework) интерактивное оповещение в трее

Программа создавалась для темы
https://forum.script-coding.com/viewtop … 63#p163063
Для оповещения слежения :

  • "Дисковое пространство", во время сбоя, или исправления его

  • Для слежения свободной/занятой памяти при защите  uwfmgr.exe

При этом, было желание, сделать программу exe , такую, что бы в неё, можно было посылать
оповещения от VBS скрипта, т.к. он быстро исправляемый и не подлежит компиляции.
Основная проблема было подружить, разные языки. А из-за того что у VBS все данные имеют тип variant, то все объекты которые засылались из VBS в exe Framework-а не виделись.
Основа программы для трея был взят VBS скрипт.
https://forum.script-coding.com/viewtop … 57#p163057
Скрипт, полностью мной был пересобран. И отделён от VBS фалов и VB.NET файлов.
Компилирование exe , с помощью ком строки.
1
файл Program.vb


Option Explicit
'--------------------------------------
'-- это атрибутика подкачки библиотек
'--------------------------------------
    Imports System.Windows.Forms
    Imports System.Management
    Imports System.IO
    Imports System
    Imports Microsoft.VisualBasic
    Imports System.Timers



  
    Module Program

Public Const A_2 As String  = "A_2" '"Время_отображения_текста" '-моргание
Public Const A_3 As String  = "A_3" '"Отображать\скрывать"
Public Const A_4 As String  = "A_4" '"Путь_к_картинки"
Public Const A_5 As String  = "A_5" '"Текст_процесса"
Public Const A_6 As String  = "A_6" '"Текст_результата"

	

	Public checkProcessTimer_ As System.Timers.Timer
        Public checkProcessTimer As System.Timers.Timer


Public  Timer_Scaner_ as integer= 60000 '--- 1 минута или 60 секунд
Public  NewTimer_ as integer=3000 '--- 40 секунд
Public  NewBalloon_ as integer=0
Public  NewVisible_ as Byte=1
Public  NewPathIcon_ as String=Path.GetDirectoryName(Application.ExecutablePath) & "\start.ico"
Public  NewProcess_ as String="СЛЕЖЕНИЕ"
Public  NewMessage_ as String="запущено"

Public   name_ as String = "storage"
Public  x_ as Byte = 0


'--------------------------------------
'-- процедура для поиска hwnd проги
'--------------------------------------
        Function GetScriptProcessId(scriptPath As String, x As String) As Integer
            Dim query As String = "SELECT ProcessId, CommandLine FROM Win32_Process WHERE Name ='" &  x & "'"
            Dim searcher As New ManagementObjectSearcher(query)
            For Each proc As ManagementObject In searcher.Get()
                Dim cmd As String = proc("CommandLine")
                If Not cmd Is Nothing Then
                    cmd = cmd.ToLower()
                    If cmd.Contains(scriptPath.ToLower()) Then
                        Return Convert.ToInt32(proc("ProcessId"))
                    End If
                End If
            Next
            Return -1
        End Function

'--------------------------------------
'-- запуск модуля всегда будет с Main, как и в VB6
'--------------------------------------
        Sub Main()


            Application.EnableVisualStyles()
            Application.SetCompatibleTextRenderingDefault(False)


	checkProcessTimer_ = New System.Timers.Timer(Timer_Scaner_)
	AddHandler checkProcessTimer_.Elapsed, AddressOf CheckParentProcess_Global
	checkProcessTimer_.Start()


        '--------------------------------------
        '-- Получение номера процеса выполняющей проги
        '-- для того что бы его использовать в классе, для закрытия проги по меню
        '--------------------------------------
            Dim scriptPath As String = Application.ExecutablePath
            Dim fi As New IO.FileInfo(scriptPath)
            Dim pid As Integer = GetScriptProcessId(scriptPath,fi.Name)
            If pid = -1 Then
                MessageBox.Show("Could not find process for: " & scriptPath)
                Return
            End If
        '--------------------------------------
        '-- объявление внутри себя библиотеки
        '-- Это объявление библиотеки запускается с аргументами
        '--------------------------------------
                    Dim trayApp As New TrayApp(pid)

        '--------------------------------------
        '-- запуск себя
        '--------------------------------------
               Application.Run()
    End Sub

'===программа выполнения по таймеру опроса проводника и ======================
' - перебор объекта Dictionsry с чтением в нём всех параметров
'--------------------------------------
Private Sub CheckParentProcess_Global(sender As Object, e As ElapsedEventArgs)
Dim ShellWindow as Object 
Dim ShellWindows as Object = CreateObject("Shell.Application").Windows

        For Each ShellWindow in ShellWindows
            if Instr(1,ShellWindow.StatusText,name_) = 1 Then 

	NewBalloon_ = Cint(ShellWindow.GetProperty(A_2))
if NewVisible_=1 then	
NewVisible_ = Cbyte(ShellWindow.GetProperty(A_3))
end if
	NewPathIcon_ = CStr(ShellWindow.GetProperty(A_4))
	NewProcess_  = CStr(ShellWindow.GetProperty(A_5))
	NewMessage_   = CStr(ShellWindow.GetProperty(A_6))
x_=0


	Exit Sub
             end if    
	Next
End Sub
'===============================



    End Module

2
файл TrayApp.vb


    Imports System
    Imports System.Drawing
    Imports System.IO
    Imports System.Windows.Forms
    Imports System.Diagnostics
    Imports System.Timers
    Imports Microsoft.VisualBasic


'-------------------------    
'- объявляется класс
'-------------------------    
    Public Class TrayApp



'-------------------------    
'- назначаем имя переменной для hwnd этой проги 
'-------------------------    
        Private parentPID As Integer

'-------------------------    
'- назначаем имя переменной для отслеживания каталога 
'-------------------------    
	Private fileWatcher As FileSystemWatcher
'-------------------------    
'- назначаем имя объекту иконки, которая будет появляться как иконка программы 
'- которую мы потом будем по желанию програмно менять 
'-------------------------    
        Private trayIcon As NotifyIcon

'-------------------------    
'- назначаем имя объекту меню, которое будет появляться после 
'-щёлкания по иконке проги правкнп мышии
'-------------------------    
        Private trayMenu As ContextMenuStrip

'-------------------------    
'- назначаем имя таймеру который будет по времени опрашивать "проводник" 
'-------------------------    
'        Private checkProcessTimer As System.Timers.Timer

'-------------------------    

'-------------------------    
'- Эту процедуру я закоментировал. Она будет вам показывать как для этой проги можно посылать аргумены 
'- сами аргументы прописаны в файле program.vb, при команде run 
'- в моём варианте мы запускаем прогу без аргументов 
'- процедура NEW всегда запускается когда идёт выполнение класса. При этом ЭТО класс
'- а класс всегда при объявлении его запускает именно эту процедуру 
'-------------------------    
'        Public Sub New(vbsFullPath As String, pid As Integer)
'-------------------------    
'- запуск класса с одним аргументом аргументом, это hwnd проги
'-------------------------    

        Public Sub New(pid As Integer)






'-------------------------    
'- сразу передаём этот  hwnd проги в переменную
'-------------------------    
		parentPID = pid

'-------------------------    
'- назначение переменной для меню
'- и с разу же назначения имён самих меню
'- и прикрепление к ним имена процедур при выполнении этих меню
'-------------------------    
            trayMenu = New ContextMenuStrip()
            trayMenu.Items.Add("Что было", Nothing, AddressOf ShowLog)
            trayMenu.Items.Add("Выход", Nothing, AddressOf ExitApp)

'-------------------------    
'- назначение переменной для иконки
'- и тут же назначение переменной для пока надписи когда на неё будет наведена мыша
'-------------------------    
            trayIcon = New NotifyIcon()
            trayIcon.Text = NewProcess_ 

'-------------------------    
'- назначение переменной иконки из файла
'- при этом сам файл может быть огромный по размеру и по формату
'- внутреннии функции её сами обрежут до нужнго размера и формата
'- разрешается слать файлы любых форматов картинок/фоток
'---путь к картинке и саму картинку мы будем менять програмно    
'-------------------------    
Dim bmp as System.Drawing.Bitmap= System.Drawing.Image.FromFile(NewPathIcon_, true)  
Dim hitcon as Integer = bmp.GetHicon()
Dim ico as System.Drawing.Icon = System.Drawing.Icon.FromHandle(hitcon)
           trayIcon.Icon =   ico 

'-------------------------    
'- если вы будите слать только иконки(файл *.ico), то напишите только так
'-------------------------    
' trayIcon.Icon = New System.Drawing.Icon("Y:\111\1.ico")
'-------------------------    

'-------------------------    
'- назначение меню на нажатие на иконку
'-------------------------    
            trayIcon.ContextMenuStrip = trayMenu
            trayIcon.Visible = True 

'-------------------------    
'- назначение исполнительной процедуры по 2-ойму клику мыши на иконку
'-------------------------    
            AddHandler trayIcon.DoubleClick, AddressOf OnTrayIconDoubleClick
'-------------------------    


'-------------------------    
'- назначение перемееной на таймере с его установленным временем
'-------------------------    
            checkProcessTimer = New System.Timers.Timer(NewTimer_)

'-------------------------    
'- назначение срабатывания процедуры при окончания таймера по врмени
'-------------------------    
            AddHandler checkProcessTimer.Elapsed, AddressOf CheckParentProcess
            checkProcessTimer.Start()



'-------------------------    
'- конец стартовой процедуре
'-------------------------    
        End Sub
'-------------------------    

'-------------------------    
'- меню "Что было"
'-------------------------    
        Private Sub ShowLog(sender As Object, e As EventArgs)
if NewProcess_<>"" and NewMessage_<> "" then
trayIcon.BalloonTipTitle = NewProcess_
trayIcon.BalloonTipText = NewMessage_
trayIcon.ShowBalloonTip(NewBalloon_)
end if
        End Sub

'-------------------------    
'- сама исполнительная процедура при нажатии на меню "Выход"
'-------------------------    
        Private Sub ExitApp(sender As Object, e As EventArgs)
           Try
               Dim parentProc As Process = Process.GetProcessById(parentPID)
               parentProc.Kill()
           Catch ex As Exception
           End Try
            trayIcon.Visible = False
'            If fileWatcher IsNot Nothing Then fileWatcher.EnableRaisingEvents = False
            If checkProcessTimer IsNot Nothing Then checkProcessTimer.Stop()
            Application.Exit()
        End Sub
'-------------------------    


'-------------------------    
'-Процедура по двойному клику по иконке------------------    
'- Изменяет ключ по отключению появления мессяг и наоборот
'-------------------------    
        Private Sub OnTrayIconDoubleClick(sender As Object, e As EventArgs)

If  NewVisible_=1 then 
NewVisible_=0
x_=3
trayIcon.Icon =  New System.Drawing.Icon(Path.GetDirectoryName(Application.ExecutablePath) & "\stop.ico")
ElseIf  NewVisible_=0 then 
NewVisible_=1
x_=0
trayIcon.Icon =  New System.Drawing.Icon(Path.GetDirectoryName(Application.ExecutablePath) & "\start.ico")
end if    
   	 End Sub
'-------------------------    




'-------------------------    
'-Процедура по выполнению по времени по таймеру------------------    
'-------------------------    
        Private Sub CheckParentProcess(sender As Object, e As ElapsedEventArgs)



            Try

if x_< 3 then 

If  NewVisible_=1 then 
trayIcon.Icon =  New System.Drawing.Icon(NewPathIcon_)
trayIcon.BalloonTipTitle = NewProcess_
trayIcon.BalloonTipText = NewMessage_
trayIcon.ShowBalloonTip(NewBalloon_)
end if
x_ = x_ + 1
end if  

'                Threading.Thread.Sleep(1000)
            Catch ex As Exception
            End Try


         End Sub


 



   End Class


3
ком строка запуск от админа для компиляции VB.NET


cd /d       Полный_путь_где_лежат_все_файлы
"C:\Windows\Microsoft.NET\Framework64\v2.0.50727\vbc.exe" /target:winexe /reference:System.Management.dll /out:"TrayApp.exe" "Program.vb" "TrayApp.vb"

Строка в одну строчку, никаких переносов не должно быть.
Применил сборку версии 2.0 Framework

"C:\Windows\Microsoft.NET\Framework64\v2.0.50727\vbc.exe"

Вы можете поменять на свою версию.
Я компилировал от 2.0 до 4.0 никаких ошибок нет.
.. Можете запусктить прогу сразу. Она появиться в трее. В каталоге где лежат файлы есть ещё
3-и иконки, для отображения состояния. Иконки также могут динамически меняться в зависимости от оповещения, через VBS.
При запуске, прога сразу оповестит что запущен сканер оповещения. И будет ожидать послания.
В скриптах vb все подписаны процедуры и данные... например время оповещения, и время сканирования сервера "проводник".
Вся связь, от VBS до VB.NET (ехе), осуществляется через "проводник".
Скрип для связи взят и переделан от сюда-->
https://forum.script-coding.com/viewtop … 34#p162734
4
Сам файл VBS start.vbs


Option Explicit
'=========== запуск от админа скрипта
'dim ObjShell,WshShell
'Set WshShell = WScript.CreateObject("WScript.Shell")
'If WScript.Arguments.Length = 0 Then
'  Set ObjShell = CreateObject("Shell.Application")
'  ObjShell.ShellExecute "wscript.exe" _
'    , """" & WScript.ScriptFullName & """ RunAsAdministrator", , "runas", 1
'  WScript.Quit
'End if
' ===================================================================
Const NameApp_ = "TrayApp.exe" 
Const A_2 = "A_2" '"Время_отображения_текста" '-моргание
Const A_3 = "A_3" '"Отображать\скрывать"
Const A_4 = "A_4" '"Путь_к_картинки"
Const A_5 = "A_5" '"Текст_процесса"
Const A_6 = "A_6" '"Текст_результата"
Dim B_2, B_3, B_4, B_5, B_6
Dim name_ :name_= "storage"
Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")



B_2 = 100 ' -- по умолчанию - моргание
B_3 = 1 '-- 1-видно/0 - не видно
B_4 = fso.GetFile(WScript.ScriptFullName).ParentFolder & "\alarm.ico" '-- локальный путь
B_5 = "Поцесс такой то" '-- результат какого процесса будет отображаться
B_6 = "Результат процесса такой то" '-- отображение результата

WScript.Sleep 100
OpenContainer name_

        Dim ShellWindow, ShellWindows


    Sub OpenContainer(name)
        Set ShellWindows = CreateObject("Shell.Application").Windows
        For Each ShellWindow in ShellWindows
            if Instr(1,ShellWindow.StatusText,name) = 1 Then 
ShellWindow.PutProperty A_2 , B_2
ShellWindow.PutProperty A_3 , B_3
ShellWindow.PutProperty A_4 , B_4
ShellWindow.PutProperty A_5 , B_5
ShellWindow.PutProperty A_6 , B_6
Exit Sub
end if
        Next
Set ShellWindows = nothing
WScript.Sleep 100

        Set ShellWindows = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}") 
        ShellWindows.StatusText = name
ShellWindows.PutProperty A_2 , B_2
ShellWindows.PutProperty A_3 , B_3
ShellWindows.PutProperty A_4 , B_4
ShellWindows.PutProperty A_5 , B_5
ShellWindows.PutProperty A_6 , B_6

    End Sub

WScript.Sleep 1000

'----------------------
Dim sTrayExePath: sTrayExePath = fso.GetFile(WScript.ScriptFullName).ParentFolder & "\" & NameApp_ & ""
If fso.FileExists(sTrayExePath) Then
	if GrtProcess_(NameApp_)=false then
    Dim shell: Set shell = CreateObject("WScript.Shell")
    shell.Run """" & sTrayExePath & """" , 0, False
	End If
else
WScript.echo "Файла " & NameApp_ & "  нет"
End If



'-------GET PROCESS запущен ли ЕХЕ файл? ---------------
Function GrtProcess_(Byval Myapp_) 
Dim objWMIService, objProcessList, objProcess
Dim strComputer
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objProcessList = objWMIService.ExecQuery("Select * from Win32_Process")
For Each objProcess In objProcessList
    If LCase(objProcess.Name) = LCase(Myapp_) Then
GrtProcess_= True
        Exit For
	else
GrtProcess_=  False
    End If
Next

End function

В этот код добавляются процессы для слежения. В переменную 

B_4 = fso.GetFile(WScript.ScriptFullName).ParentFolder & "\alarm.ico" '-- локальный путь
B_5 = "Поцесс такой то" '-- результат какого процесса будет отображаться
B_6 = "Результат процесса такой то" '-- отображение результата

передаются данные от слежения, + иконка, которая должна сфокусировать внимание юзера.
Само оповещение , моргает 3 раза. Потом замолкает. Но по клику exe правой конпкой мыши появляется меню "Что было" и "Выход". При нажатии на "Выход" , прога закрывается.
Но она может запуститься от VBS, который отслеживает, запущенна ли эта прога или нет. Если нет, то запускает её. Я собираюсь эту VBS поместить в плнировщик задач, который будет запускать этот VBS по времени. А т.к. я могу в срипте менять сразу что угодно, то оповещение сразу будет реагировать на изменения параметров.
По умолчанию, я выбрал сканер "проводника",


Timer_Scaner_ as integer= 60000 '--- 1 минута или 60 секунд
и сканер внутреннего оповещателя в exe
NewTimer_ as integer=3000 '--- 3 секунды

Вы можете все временные и другие параметры поменять на свои.
Что ещё?
Если нажать на exe левой кнопкой мыши 2-а раза, то поменяется иконка, свидетельствующая о том, что прога умолкает , но сканирует. Она просто молчит и не треводит юзера. При повторном 2-ом нажатии прога опять просыпается, и продолжает напоминать юзеру.
Этот напоминальщик, можно употребить например для будильника.
Меню "Что было". Служит на тот момент, когда юзер заставил прогу заснуть, а процессы продолжались. Тогда при нажатии этого меню, будет появляться то что было послений раз при сканировании. В принципе можно замутить и запись лога, всех напоминлок и просмотр по этому  меню их всех , которые были во время сна проги.
В RAR файле выкладываю все файлы. Кроме exe , вы сами его скомпилируете.
Принцип работы прост.
При загрузки вина запускается процесс в планировщике VBS. Скрипт, проверяет, запущена ли exe , Если да то не запускает её, если нет, то запускает её вкаталоге где находиться сам VBS скрипт. Там же лежать иконки, которые цепляются скриптом и exe.
Иконки можете класть любые и в VBS их менять. Они будут отправляться в exe.
Под иконки, можно применять и файлы огромные jpg. Прога exe сама их уменьшит и превратит в иконку. Хоть фотку, проге пофиг. Т.к. планировщик, будет заточен на зупуск, по времени, то по времени будет запускаться VBS делать свои сканирующие прогоны, и выдадвать результат в exe через "проводник". Проводник в данном случае служит как "сервер" пересылщик между VBS и VB.NET
В файле install.txt код который вставляется в терминал ком строки.
При перезагрузки "проводника", через "диспетчер задач", проводник очищается от всех данных. Как будто вы только что вошли в вин.
И ещё. Для отображения кирилицы в сообщениях, сохраняйте все файлы скриптов в ANSI кодировке.

Post's attachments

TrayApp.rar 54.07 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

2

Re: WSH,VBS,JS: VB.NET (Framework) интерактивное оповещение в трее

В файле start.vbs
есть закоментированный код с запуском от админа.
Он служит для запуска скрипта с правами админа.
Права админа нужны для запуска сканера по свободному пространству памяти при защите "uwfmgr.exe".
А также при проверке, "дискового пространства".
Я этот код закоментировал по причине того что в планировщике существует галка, при установке которой, скрипт будет запускаться с правами админа, при этом никакие UAC не будут выскакивать.
Но те кто будет запускать руками, для тех есть этот код.

3

Re: WSH,VBS,JS: VB.NET (Framework) интерактивное оповещение в трее

Вот такой результат будет

https://allwebs.ru/images/2026/02/13/1b923661eddf5b47effe62af56387645.jpg

https://allwebs.ru/images/2026/02/13/c1cc4a8c35efa9f822276a6d66c3f98b.jpg

https://allwebs.ru/images/2026/02/13/05c73faffa5b06036ba5cf013953f0a0.jpg

4

Re: WSH,VBS,JS: VB.NET (Framework) интерактивное оповещение в трее

ПЕРВЫЙ ПОШЁЛ !!!
Включил файл монитор "Дискового пространства".
В файл start.vbs  был добавлен файл "MONITOR_RAID.vbs"
файл start.vbs с изменениями

Option Explicit
'=========== запуск от админа скрипта
dim ObjShell,WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
If WScript.Arguments.Length = 0 Then
  Set ObjShell = CreateObject("Shell.Application")
  ObjShell.ShellExecute "wscript.exe" _
    , """" & WScript.ScriptFullName & """ RunAsAdministrator", , "runas", 1
  WScript.Quit
End if
' ===================================================================
Const NameApp_ = "TrayApp.exe" 
Const A_2 = "A_2" '"Время_отображения_текста" '-моргание
Const A_3 = "A_3" '"Отображать\скрывать"
Const A_4 = "A_4" '"Путь_к_картинки"
Const A_5 = "A_5" '"Текст_процесса"
Const A_6 = "A_6" '"Текст_результата"
Dim B_2, B_3, B_4, B_5, B_6
Dim name_ :name_= "storage"
Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")



B_2 = 100 ' -- по умолчанию - моргание
B_3 = 1 '-- 1-видно/0 - не видно
B_4 = fso.GetFile(WScript.ScriptFullName).ParentFolder & "\alarm.ico" '-- локальный путь
B_5 = "какой процесс" '-- результат какого процесса будет отображаться
B_6 = "отображение результата" '-- отображение результата

WScript.Sleep 100

'============загрузка других модулей
'== загружается МОНИТОР RAID
' это нужно вставлять в каждый модуль vbs 
Call IncludeFile(fso.GetFile(WScript.ScriptFullName).ParentFolder & "\MONITOR_RAID.vbs")
Sub IncludeFile(fname)
    executeGlobal CreateObject("Scripting.FileSystemObject").openTextFile(fname).readAll()
end sub
'============

Call Main ' == эта процедура находиться в файле "MONITOR_RAID.vbs"
B_4 = fso.GetFile(WScript.ScriptFullName).ParentFolder & "\disk.jpg" '-- иконка диска

' = после того как переменные B_4,  B_5 и B_6 получат данные от модуля "MONITOR_RAID.vbs",
' = они поёдут на передачу в exe
'   |
'  \|/
OpenContainer name_

        Dim ShellWindow, ShellWindows


    Sub OpenContainer(name)
        Set ShellWindows = CreateObject("Shell.Application").Windows
        For Each ShellWindow in ShellWindows
            if Instr(1,ShellWindow.StatusText,name) = 1 Then 
ShellWindow.PutProperty A_2 , B_2
ShellWindow.PutProperty A_3 , B_3
ShellWindow.PutProperty A_4 , B_4
ShellWindow.PutProperty A_5 , B_5
ShellWindow.PutProperty A_6 , B_6
Exit Sub
end if
        Next
Set ShellWindows = nothing
WScript.Sleep 100

        Set ShellWindows = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}") 
        ShellWindows.StatusText = name
ShellWindows.PutProperty A_2 , B_2
ShellWindows.PutProperty A_3 , B_3
ShellWindows.PutProperty A_4 , B_4
ShellWindows.PutProperty A_5 , B_5
ShellWindows.PutProperty A_6 , B_6

    End Sub

WScript.Sleep 1000

'----------------------
Dim sTrayExePath: sTrayExePath = fso.GetFile(WScript.ScriptFullName).ParentFolder & "\" & NameApp_ & ""
If fso.FileExists(sTrayExePath) Then
	if GrtProcess_(NameApp_)=false then
    Dim shell: Set shell = CreateObject("WScript.Shell")
    shell.Run """" & sTrayExePath & """" , 0, False
	End If
else
WScript.echo "Файла " & NameApp_ & "  нет"
End If



'-------GET PROCESS запущен ли ЕХЕ файл? ---------------
Function GrtProcess_(Byval Myapp_) 
Dim objWMIService, objProcessList, objProcess
Dim strComputer
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objProcessList = objWMIService.ExecQuery("Select * from Win32_Process")
For Each objProcess In objProcessList
    If LCase(objProcess.Name) = LCase(Myapp_) Then
GrtProcess_= True
        Exit For
	else
GrtProcess_=  False
    End If
Next

End function




Учтите я в файле снял коменты с кода для запуска от админа. Это для проверки работоспособности скрипта.
Потом после отладки я админный запуск удалю.
В этом коде есть строки


'============загрузка других модулей
'== загружается МОНИТОР RAID
' это нужно вставлять в каждый модуль vbs 
Call IncludeFile(fso.GetFile(WScript.ScriptFullName).ParentFolder & "\MONITOR_RAID.vbs")
Sub IncludeFile(fname)
    executeGlobal CreateObject("Scripting.FileSystemObject").openTextFile(fname).readAll()
end sub
'============

Это и есть модуль  MONITOR_RAID.vbs. Внутри модуля принимают значения переменные B_5 и B_6 (титл и месяга). переменная B_4 (какртинка) , принимает значение за пределами модуля MONITOR_RAID.vbs.
Так же были изменены модули
Program.vb и TrayApp.vb.
Program.vb

Option Explicit
'--------------------------------------
'-- это атрибутика подкачки библиотек
'--------------------------------------
    Imports System.Windows.Forms
    Imports System.Management
    Imports System.IO
    Imports System
    Imports Microsoft.VisualBasic
    Imports System.Timers
    Imports System.Drawing



  
    Module Program

Public Const A_2 As String  = "A_2" '"Время_отображения_текста" '-моргание
Public Const A_3 As String  = "A_3" '"Отображать\скрывать"
Public Const A_4 As String  = "A_4" '"Путь_к_картинки"
Public Const A_5 As String  = "A_5" '"Текст_процесса"
Public Const A_6 As String  = "A_6" '"Текст_результата"

	

	Public checkProcessTimer_ As System.Timers.Timer
        Public checkProcessTimer As System.Timers.Timer


Public  Timer_Scaner_ as integer= 60000 '--- 1 минута или 60 секунд
Public  NewTimer_ as integer=3000 '--- 40 секунд
Public  NewBalloon_ as integer=0
Public  NewVisible_ as Byte=1
Public  NewPathIcon_ as String=Path.GetDirectoryName(Application.ExecutablePath) & "\start.ico"
Public  NewProcess_ as String="СЛЕЖЕНИЕ"
Public  NewMessage_ as String="запущено"

Public   name_ as String = "storage"
Public  x_ as Byte = 0
'- графика
Public  ico as System.Drawing.Icon 
Public   bmp as System.Drawing.Bitmap 
Public   hitcon as Integer


'--------------------------------------
'-- процедура для поиска hwnd проги
'--------------------------------------
        Function GetScriptProcessId(scriptPath As String, x As String) As Integer
            Dim query As String = "SELECT ProcessId, CommandLine FROM Win32_Process WHERE Name ='" &  x & "'"
            Dim searcher As New ManagementObjectSearcher(query)
            For Each proc As ManagementObject In searcher.Get()
                Dim cmd As String = proc("CommandLine")
                If Not cmd Is Nothing Then
                    cmd = cmd.ToLower()
                    If cmd.Contains(scriptPath.ToLower()) Then
                        Return Convert.ToInt32(proc("ProcessId"))
                    End If
                End If
            Next
            Return -1
        End Function

'--------------------------------------
'-- запуск модуля всегда будет с Main, как и в VB6
'--------------------------------------
        Sub Main()


            Application.EnableVisualStyles()
            Application.SetCompatibleTextRenderingDefault(False)


	checkProcessTimer_ = New System.Timers.Timer(Timer_Scaner_)
	AddHandler checkProcessTimer_.Elapsed, AddressOf CheckParentProcess_Global
	checkProcessTimer_.Start()


        '--------------------------------------
        '-- Получение номера процеса выполняющей проги
        '-- для того что бы его использовать в классе, для закрытия проги по меню
        '--------------------------------------
            Dim scriptPath As String = Application.ExecutablePath
            Dim fi As New IO.FileInfo(scriptPath)
            Dim pid As Integer = GetScriptProcessId(scriptPath,fi.Name)
            If pid = -1 Then
                MessageBox.Show("Could not find process for: " & scriptPath)
                Return
            End If
        '--------------------------------------
        '-- объявление внутри себя библиотеки
        '-- Это объявление библиотеки запускается с аргументами
        '--------------------------------------
                    Dim trayApp As New TrayApp(pid)

        '--------------------------------------
        '-- запуск себя
        '--------------------------------------
               Application.Run()
    End Sub

'===программа выполнения по таймеру опроса проводника и ======================
' - перебор объекта Dictionsry с чтением в нём всех параметров
'--------------------------------------
Private Sub CheckParentProcess_Global(sender As Object, e As ElapsedEventArgs)
Dim ShellWindow as Object 
Dim ShellWindows as Object = CreateObject("Shell.Application").Windows

        For Each ShellWindow in ShellWindows
            if Instr(1,ShellWindow.StatusText,name_) = 1 Then 

	NewBalloon_ = Cint(ShellWindow.GetProperty(A_2))
if NewVisible_ = 1 then
NewVisible_ = Cbyte(ShellWindow.GetProperty(A_3))
end if
	NewPathIcon_ = CStr(ShellWindow.GetProperty(A_4))
	NewProcess_  = CStr(ShellWindow.GetProperty(A_5))
	NewMessage_   = CStr(ShellWindow.GetProperty(A_6))
x_=0


	Exit Sub
             end if    
	Next
End Sub
'===============================



    End Module

модуль TrayApp.vb


    Imports System
    Imports System.Drawing
    Imports System.IO
    Imports System.Windows.Forms
    Imports System.Diagnostics
    Imports System.Timers
    Imports Microsoft.VisualBasic


'-------------------------    
'- объявляется класс
'-------------------------    
    Public Class TrayApp



'-------------------------    
'- назначаем имя переменной для hwnd этой проги 
'-------------------------    
        Private parentPID As Integer

'-------------------------    
'- назначаем имя переменной для отслеживания каталога 
'-------------------------    
	Private fileWatcher As FileSystemWatcher
'-------------------------    
'- назначаем имя объекту иконки, которая будет появляться как иконка программы 
'- которую мы потом будем по желанию програмно менять 
'-------------------------    
        Private trayIcon As NotifyIcon

'-------------------------    
'- назначаем имя объекту меню, которое будет появляться после 
'-щёлкания по иконке проги правкнп мышии
'-------------------------    
        Private trayMenu As ContextMenuStrip

'-------------------------    
'- назначаем имя таймеру который будет по времени опрашивать "проводник" 
'-------------------------    
'        Private checkProcessTimer As System.Timers.Timer

'-------------------------    

'-------------------------    
'- Эту процедуру я закоментировал. Она будет вам показывать как для этой проги можно посылать аргумены 
'- сами аргументы прописаны в файле program.vb, при команде run 
'- в моём варианте мы запускаем прогу без аргументов 
'- процедура NEW всегда запускается когда идёт выполнение класса. При этом ЭТО класс
'- а класс всегда при объявлении его запускает именно эту процедуру 
'-------------------------    
'        Public Sub New(vbsFullPath As String, pid As Integer)
'-------------------------    
'- запуск класса с одним аргументом аргументом, это hwnd проги
'-------------------------    

        Public Sub New(pid As Integer)






'-------------------------    
'- сразу передаём этот  hwnd проги в переменную
'-------------------------    
		parentPID = pid

'-------------------------    
'- назначение переменной для меню
'- и с разу же назначения имён самих меню
'- и прикрепление к ним имена процедур при выполнении этих меню
'-------------------------    
            trayMenu = New ContextMenuStrip()
            trayMenu.Items.Add("Что было", Nothing, AddressOf ShowLog)
            trayMenu.Items.Add("Выход", Nothing, AddressOf ExitApp)

'-------------------------    
'- назначение переменной для иконки
'- и тут же назначение переменной для пока надписи когда на неё будет наведена мыша
'-------------------------    
            trayIcon = New NotifyIcon()
            trayIcon.Text = NewProcess_ 

'-------------------------    
'- назначение переменной иконки из файла
'- при этом сам файл может быть огромный по размеру и по формату
'- внутреннии функции её сами обрежут до нужнго размера и формата
'- разрешается слать файлы любых форматов картинок/фоток
'---путь к картинке и саму картинку мы будем менять програмно    
'-------------------------
bmp = System.Drawing.Image.FromFile(NewPathIcon_, true)  
hitcon = bmp.GetHicon()
ico = System.Drawing.Icon.FromHandle(hitcon)
trayIcon.Icon =   ico 

'-------------------------    
'- если вы будите слать только иконки(файл *.ico), то напишите только так
'-------------------------    
' trayIcon.Icon = New System.Drawing.Icon("Y:\111\1.ico")
'-------------------------    

'-------------------------    
'- назначение меню на нажатие на иконку
'-------------------------    
            trayIcon.ContextMenuStrip = trayMenu
            trayIcon.Visible = True 

'-------------------------    
'- назначение исполнительной процедуры по 2-ойму клику мыши на иконку
'-------------------------    
            AddHandler trayIcon.DoubleClick, AddressOf OnTrayIconDoubleClick
'-------------------------    


'-------------------------    
'- назначение перемееной на таймере с его установленным временем
'-------------------------    
            checkProcessTimer = New System.Timers.Timer(NewTimer_)

'-------------------------    
'- назначение срабатывания процедуры при окончания таймера по врмени
'-------------------------    
            AddHandler checkProcessTimer.Elapsed, AddressOf CheckParentProcess
            checkProcessTimer.Start()



'-------------------------    
'- конец стартовой процедуре
'-------------------------    
        End Sub
'-------------------------    

'-------------------------    
'- меню "Что было"
'-------------------------    
        Private Sub ShowLog(sender As Object, e As EventArgs)
if NewProcess_<>"" and NewMessage_<> "" then
trayIcon.BalloonTipTitle = NewProcess_
trayIcon.BalloonTipText = NewMessage_
trayIcon.ShowBalloonTip(NewBalloon_)

bmp = System.Drawing.Image.FromFile(NewPathIcon_, true)  
hitcon = bmp.GetHicon()
ico = System.Drawing.Icon.FromHandle(hitcon)
trayIcon.Icon =   ico 

end if
        End Sub

'-------------------------    
'- сама исполнительная процедура при нажатии на меню "Выход"
'-------------------------    
        Private Sub ExitApp(sender As Object, e As EventArgs)
           Try
               Dim parentProc As Process = Process.GetProcessById(parentPID)
               parentProc.Kill()
           Catch ex As Exception
           End Try
            trayIcon.Visible = False
'            If fileWatcher IsNot Nothing Then fileWatcher.EnableRaisingEvents = False
            If checkProcessTimer IsNot Nothing Then checkProcessTimer.Stop()
            Application.Exit()
        End Sub
'-------------------------    


'-------------------------    
'-Процедура по двойному клику по иконке------------------    
'- Изменяет ключ по отключению появления мессяг и наоборот
'-------------------------    
        Private Sub OnTrayIconDoubleClick(sender As Object, e As EventArgs)

If  NewVisible_=1 then 
NewVisible_=0
x_=3
trayIcon.Icon =  New System.Drawing.Icon(Path.GetDirectoryName(Application.ExecutablePath) & "\stop.ico")
ElseIf  NewVisible_=0 then 
NewVisible_=1
x_=0
trayIcon.Icon =  New System.Drawing.Icon(Path.GetDirectoryName(Application.ExecutablePath) & "\start.ico")
end if    
   	 End Sub
'-------------------------    




'-------------------------    
'-Процедура по выполнению по времени по таймеру------------------    
'-------------------------    
        Private Sub CheckParentProcess(sender As Object, e As ElapsedEventArgs)



            Try

if x_< 3 then 

If  NewVisible_=1 then 
'trayIcon.Icon =  New System.Drawing.Icon(NewPathIcon_)

bmp = System.Drawing.Image.FromFile(NewPathIcon_, true)  
hitcon = bmp.GetHicon()
ico = System.Drawing.Icon.FromHandle(hitcon)
trayIcon.Icon =   ico 

trayIcon.BalloonTipTitle = NewProcess_
trayIcon.BalloonTipText = NewMessage_
trayIcon.ShowBalloonTip(NewBalloon_)
end if
x_ = x_ + 1
end if  

'                Threading.Thread.Sleep(1000)
            Catch ex As Exception
            End Try


         End Sub


 



   End Class


эти изменения сделаны для того что выяснилось что когда я гружу картинку jpg прога молчит.
Теперь можно грузить любые картинки.

5 (изменено: 3wedsmncjklvjvd73734, 2026-02-13 14:42:17)

Re: WSH,VBS,JS: VB.NET (Framework) интерактивное оповещение в трее

было
https://allwebs.ru/images/2026/02/13/1ddfc861796f7492b4f7f5beb3683898.jpg
При этом окно выпадало в самый не нужный момент. Да ещё и в цент экрана.

стало

https://allwebs.ru/images/2026/02/13/978cf8a4a85f5bfab4a63b0774c60afa.jpg

При этом тупо взял и из окна "панель управления" скопировал экран, в паинте обрезал и увеличил картинку.

https://allwebs.ru/images/2026/02/13/12c5f9fc675d67faf7cff0b38d688fd7.jpg

При этом размер был картинки намного больше чем 16х16 или 32х32

https://allwebs.ru/images/2026/02/13/7ede15339d628f1c126ea9b5529885df.jpg

осталось сделать фон для иконок что бы были прозрачные а не белые

Потом заделаю мониторинг, Get-StorageJob
по типу --> https://forum.script-coding.com/viewtop … 23#p163023

Post's attachments

TrayApp.rar 65.84 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

6 (изменено: 3wedsmncjklvjvd73734, 2026-02-20 23:17:02)

Re: WSH,VBS,JS: VB.NET (Framework) интерактивное оповещение в трее

Запуск vbs в планировщике.
---------------
В закладке "Тригеры"--> изменить
напротив "начать задачу" выбираем "При входе в систему".
Ниже напротив "Повторять задачу каждые", я выбрал 10 минут.
в самом низу установить галку "включено".
------------
в закладке "действие"--> изменить-->действие--> обзор
пишем путь к wscript.exe
"C:\Windows\System32\wscript.exe"
В поле  "Добавить агрументы" пишем.
//Nologo   //B     ВАШ_ДИСК_ПУТЬ_КВАШЕМУ_VBS\start.vbs.
------------
Теперь при каждом вкл. компа, у вас будет грузиться ваша напоминалка в трее.
При  любом изменении чего либо в файле start.vbs, будет интерактивно и моментально отражено в проге "TrayApp.exe"

Вдогонку.
В планировщике, в закладке "Общие", в самом низу есть галка
"Выполнять с наивысшими правами". Установите там галку.
При этом в самом файле "start.vbs", закоментируйте строки запуска скрипта с
правами от админа.


'=========== запуск от админа скрипта
'dim ObjShell,WshShell
'Set WshShell = WScript.CreateObject("WScript.Shell")
'If WScript.Arguments.Length = 0 Then
'  Set ObjShell = CreateObject("Shell.Application")
'  ObjShell.ShellExecute "wscript.exe" _
'    , """" & WScript.ScriptFullName & """ RunAsAdministrator", , "runas", 1
'  WScript.Quit
'End if
' =========================================================

После установки галки в планировщике, этот скрипт будет запускаться с правами админа.

7 (изменено: 3wedsmncjklvjvd73734, 2026-02-21 23:57:47)

Re: WSH,VBS,JS: VB.NET (Framework) интерактивное оповещение в трее

добавил модуль монитора процесса восстановления, для того что бы руками не запускать
периодически для отслеживания в PowerShell команду Get-StorageJob.
Вот что получилось

https://allwebs.ru/images/2026/02/21/954087fb9175e18a404b4aaadba8d7b8.jpg

https://allwebs.ru/images/2026/02/21/0c70c846bb0c0814c4dda5616f426061.jpg

Изменил для этого файл
start.vbs

И добавил файл Get-StorageJob
VBS_JOB.vbs


option explicit

Sub Jobs()

'-------------------------- ----------------------
	Dim oWMI, WQL, Instances, Instance
	
	Set oWMI = GetObject("WINMGMTS:\\.\ROOT\Microsoft\Windows\Storage\providers_v2")
	
	WQL = "Select * from SPACES_StorageJob"
	
	Set Instances = oWMI.ExecQuery(WQL)
	For Each Instance In Instances 
'----- переменная Jobs_ объявлена в файле start.vbs поэтому она глобальная
Jobs_ = Jobs_ &  Instance.Name 

Jobs_ = Jobs_ & " : сделано=" &  Instance.PercentComplete & "% (" &  FormatNumber(Instance.BytesProcessed/(1024 ^ 3),2) & " Gb" & ") из " & FormatNumber(Instance.BytesTotal/(1024 ^ 3),2) & " Gb" & vbcrlf



WScript.sleep 100

	Next 'Instance
Set Instances =nothing

end sub


После того как запускается процесс мониторинга "дискового пространства", и при обнаружении неполадок,

выскакивает окно "дискового пространства" из "панели управления".
И сразу начинается процесс мониторинга команды Get-StorageJob.
Я не стал отображать другие параметры, такие как время и статус.
Потому что это уже большая вкладка. Я думаю что для меня и этого хватит для отслеживания.
При этом я сам exe не переделывал. Просто дописал сам файл start.vbs и написал файл  VBS_JOB.vbs

Очень удобно, отключить "моргалку", что бы уснула и периодически с помощью меню "Что было" просматривать процесс восстановления.
При этом в окне "дисковое пространство" из "панели управления" вообще молчок про процесс восстановления.Юзеру мол не надо об этом знать.
Проц еле, еле нагружен.
ВЕЩЬ!!

Post's attachments

start.vbs 4.48 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

8 (изменено: 3wedsmncjklvjvd73734, 2026-02-23 10:26:19)

Re: WSH,VBS,JS: VB.NET (Framework) интерактивное оповещение в трее

Добавил файл модуль проверки защиты SSD "uwfmgr.exe"

https://allwebs.ru/images/2026/02/23/604afa1047fa1cb381e9cc070dd77bf6.jpg

https://allwebs.ru/images/2026/02/23/2e84f116fecdbe596360b12d6baccda9.jpg

memory.vbs


Option Explicit
'=========== запуск от админа скрипта
'dim ObjShell,WshShell
'Set WshShell = WScript.CreateObject("WScript.Shell")
'If WScript.Arguments.Length = 0 Then
'  Set ObjShell = CreateObject("Shell.Application")
'  ObjShell.ShellExecute "wscript.exe" _
'    , """" & WScript.ScriptFullName & """ RunAsAdministrator", , "runas", 1
'  WScript.Quit
'End if
' ===================================================================


'call  Mem_

Sub Mem_()
'dim Memm_

'-------------------------- ----------------------
	Dim oWMI, WQL, Instances, Instance
	
	Set oWMI = GetObject("WINMGMTS:\\.\ROOT\standardcimv2\embedded")
	
	WQL = "Select * from UWF_Overlay"
	
	Set Instances = oWMI.ExecQuery(WQL)
	For Each Instance In Instances 
'----- переменная Memm_ объявлена в файле start.vbs поэтому она глобальная
Memm_ =  "занято :  " & Instance.OverlayConsumption & " MБ" & vbcrlf & vbcrlf
Memm_ = Memm_ &  "всего :  " & Instance.CriticalOverlayThreshold & " MБ"

WScript.sleep 100
	Next 'Instance
'Wscript.Echo Memm_

Set Instances =nothing
Set oWMI =nothing
end sub


вложил сюда файл
Tray.rar

там новый exe и новые файлы Program.vb и TrayApp.vb
а также start.vbs
Изменились.
1- моргает 2-а раза для привлечения внимания.
2- добавлен модуль защиты SSD.
3- добавлен модуль восстановления дискового пространства.
4- добавлен модуль проверки дискового пространства.
5- добавлена память сообщения. Если сообщение повторяется, без изменений, то оно не появляется. Мол оно нафиг не надо юзеру. Надо будет, пусть смотрит "Что было"
6- добавлены новые иконки

Post's attachments

Tray.rar 101.28 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.