1

Тема: WSH: WSO — пример работы с иконкой в SystemTray

В библиотеке WindowSystemObject (WSO) есть класс TrayIcon, который создаёт иконку в области SystemTray (около часиков). В документации и примерах нет описания его использования. Восполним данный пробел примером на JScript.

Описание примера:
При сворачивании окна приложения в области SystemTray появляется иконка (кнопка окна на панели задач при этом скрывается). При щелчке на этой иконке окно приложения восстанавливается, а иконка убирается.

Особенности:
1. В объектной модели WSO у класса Form отсутствует событие минимизации окна — используется событие onResize(), при высоте окна меньше 30.
2. При скрытии окна происходит выход из метода Run() — используется цикл по условию наличия форм oWso.Controls.Count. Выход из скрипта при разрушении формы методом Destroy().

var oWso = new ActiveXObject("Scripting.WindowSystemObject")
var cTray = oWso.CreateImageList()
cTray.Height=32
cTray.Width=32
cTray.Load(oWso.LoadImage("c:\\Windows\\winnt.bmp"))
var Tray=oWso.CreateTrayIcon()
Tray.Hint="TrayIcon Test"
Tray.Images=cTray
Tray.ImageIndex=0
Tray.Active=true

var f = oWso.CreateForm(0,0,0,0)
f.Icon="c:\\Windows\\winnt.bmp"
f.Text = "Тест"

f.ClientWidth = 100
f.ClientHeight = 100
f.CenterControl()

f.MaximizeBox =false
f.SizeGrip=true

f.onClose=function(Sender)
{Sender.Destroy()}

f.onResize=function(Sender)
{
if (Tray.Active)
{
Tray.Active=false
}
else if (Sender.Height <30)
{
Tray.Active=true
f.Hide()
}
}

Tray.onClick=function(Sender)
{
f.Show()
f.Restore()
}

f.Show()
Tray.Active=false
while (oWso.Controls.Count)
{
oWso.Run()
WScript.Sleep(100)
}

Автор идеи — badik.

2

Re: WSH: WSO — пример работы с иконкой в SystemTray

Перевод предыдущего примера на VBScript. Отличие лишь в том, что в событии onResize() проверяются размеры клиентской части формы на равенство нулю.

Option Explicit

Dim objWSO
Dim objImageList
Dim objTrayIcon
Dim objForm


Set objWSO = WScript.CreateObject("Scripting.WindowSystemObject")

Set  objImageList = objWSO.CreateImageList()
With objImageList
    .Load objWSO.LoadImage("c:\Windows\winnt.bmp")
End With

Set  objTrayIcon = objWSO.CreateTrayIcon()
With objTrayIcon
    .Hint = "TrayIcon Test"
    .Images = objImageList
    .ImageIndex = 0
    
    .onClick = GetRef("TrayIcon_onClick")
End With

Set  objForm = objWSO.CreateForm(0, 0, 0, 0)
With objForm
    .Icon = "c:\Windows\winnt.bmp"
    .Text = "Тест"
    
    .ClientWidth  = 200
    .ClientHeight = 100
    
    .MinWidth     = 100
    .MinHeight    =  50
    
    .CenterControl()
    
    .MaximizeBox = False
    .SizeGrip    = True
    
    .onClose  = GetRef("Form_onClose")
    .onResize = GetRef("Form_onResize")
    
    .Show()
End With


Do
    objWSO.Run()
    
    WScript.Sleep 100
Loop Until objWSO.Controls.Count = 0

Set objForm      = Nothing
Set objTrayIcon  = Nothing
Set objImageList = Nothing
Set objWSO       = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub Form_onClose(Sender)
    Sender.Destroy()
End Sub
'=============================================================================

'=============================================================================
Sub Form_onResize(Sender)
    With Sender
        If .ClientHeight = 0 And .ClientHeight = 0 Then
            .Hide()
            
            objTrayIcon.Active = True
        End If
    End With
End Sub
'=============================================================================

'=============================================================================
Sub TrayIcon_onClick(Sender)
    Sender.Active = False
    
    With objForm
        .Show()
        .Restore()
    End With
End Sub
'=============================================================================

Как в предыдущем, так и в этом примере для ясности можно подставить любую имеющуюся реальную иконку «*.ico» вместо «c:\Windows\winnt.bmp».