Desenvolvimento - Visual Basic

System Tray - O seu ícone ao lado do relógio do Windows

O System Tray é situada no Windows Taskbar, geralmente no canto direito inferior ao lado do relógio.

por César Augusto Pinheiro



Neste artigo abordarei como adicionar, alterar ou excluir seu ícone ao lado do relógio do Windons além de personalizar o título, a mensagem e o ícone do balão que é exibido sobre o seu ícone de acordo com a sua preferência.

Primeiramente desenvolveremos todo o código referente ao objeto SystemTray em um módulo de classe no qual criaremos seus métodos e propriedades. Sendo assim, você poderá instanciar o módulo de classe em qualquer parte de seu projeto possibilitando acessar e/ou definir as propriedades e métodos do objeto SystemTray de acordo com o seu propósito.

Pronto para começar?


Inicie um módulo de classe, renomei-e como clsSystemTray e insere o código a seguir:

Option Explicit
"**************************************************
"Classe criada por César A Pinheiro em 18/12/2007
"Última alteração em 18/12/2007 por César A Pinheiro
"Descr.: cria um objeto System Tray (ícone ao lado do relógio do windows)
"**************************************************

"Função que envia ícone para System Tray (ao lado do relógio do windows)
Private Declare Function Shell_NotifyIcon Lib
_ "shell32.dll" Alias "Shell_NotifyIconA"
_ ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

"Declaração de propriedades do objeto STray
Private Const NIM_ADD = &H0
Private Const NIM_MODIFY = &H1
Private Const NIM_DELETE = &H2
Private Const NIF_MESSAGE = &H1
Private Const NIF_ICON = &H2
Private Const NIF_INFO = &H10
Private Const NIF_TIP = &H4
Private Const NIIF_NONE = &H0
Private Const NIIF_INFO = &H1
Private Const NIIF_WARNING = &H2
Private Const NIIF_ERROR = &H3
Private Const NIIF_USER = &H4
Private Const WM_USER = &H400
Private Const WM_MOUSEMOVE = &H200
Private Const TRAY_CALLBACK = (WM_USER + 1001&)

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

Private STray As NOTIFYICONDATA

"variáreis valores de propriedades
Private m_id As Long
Private m_hWnd As Long
Private m_activated As Boolean
Private m_tool_tip_text As String
Private m_balloon_text As String
Private m_balloon_title As String
Private m_balloon_icon As Long
Private m_icon As StdPicture

Public Enum InfoFlags
trayNone = NIIF_NONE
trayInformation = NIIF_INFO
trayExclamation = NIIF_WARNING
trayCritical = NIIF_ERROR
trayDefinedUser = NIIF_USER
End Enum

Public Sub Show(value_hWnd As Long)
If Activated = True Then
Err.Raise 513, , "O objeto já está ativo."
Exit Sub
End If
hWnd = value_hWnd
Call DefinePropertiesTray
Call Shell_NotifyIcon(NIM_ADD, STray)
Activated = True
End Sub

Public Function Refresh()
If Activated = False Then
Err.Raise 516, , "O objeto não está ativo."
Exit Function
End If
Call DefinePropertiesTray
Call Shell_NotifyIcon(NIM_MODIFY, STray)
End Function

Public Function Unload()
If Activated = False Then
Err.Raise 516, , "O objeto não está ativo."
Exit Function
End If
Call Shell_NotifyIcon(NIM_DELETE, STray)
Activated = False
End Function

"define as propriedades do SystemTray
Private Sub DefinePropertiesTray()
STray.uID = Id
STray.hWnd = hWnd
STray.cbSize = Len(STray)
STray.hIcon = m_icon
STray.szTip = ToolTipText
STray.szInfo = BalloonText
STray.szInfoTitle = BalloonTitle
STray.uCallbackMessage = WM_MOUSEMOVE
STray.dwState = 0
STray.dwStateMask = 0
STray.uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP Or NIF_INFO
STray.dwInfoFlags = BalloonIcon
End Sub

Public Property Let Icon(new_value As String)
Set m_icon_tray = LoadPicture(new_value)
End Property

Private Property Let hWnd(new_value As Long)
m_hWnd = new_value
End Property

Private Property Let Activated(new_value As Boolean)
m_activated = new_value
End Property

Public Property Let ToolTipText(new_value As String)
m_tool_tip_text = Left(new_value, 127)
End Property

Public Property Let BalloonText(new_value As String)
m_balloon_text = Left(new_value, 255)
End Property

Public Property Let BalloonTitle(new_value As String)
m_balloon_title = Left(new_value, 63)
End Property

Public Property Let BalloonIcon(new_value As InfoFlags)
m_balloon_icon = new_value
End Property

Public Property Let Id(new_value As Long)
m_id = new_value
End Property

Private Property Get hWnd() As Long
hWnd = m_hWnd
End Property

Public Property Get Activated() As Boolean
Activated = m_activated
End Property

Public Property Get ToolTipText() As String
ToolTipText = m_tool_tip_text & vbNullChar
End Property

Public Property Get BalloonText() As String
BalloonText = m_balloon_text & vbNullChar
End Property

Public Property Get BalloonTitle() As String
BalloonTitle = m_balloon_title & vbNullChar
End Property

Public Property Get BalloonIcon() As InfoFlags
If m_balloon_icon = 0 Then
BalloonIcon = trayNone
Else
BalloonIcon = m_balloon_icon
End If
End Property

Public Property Get Id() As Long
If m_id = 0 Then
Id = vbNull
Else
Id = m_id
End If
End Property


Pronto! Agora você pode instanciar o módulo de classe no código do seu formulário e acessar suas propriedades e métodos.

Instanciando o módulo de classe no código do seu formulário:

Private SysTray As New clsSystemTray

Lista das Propriedades e Métodos da classe:

PROPRIEDADES
Activate Retorna valor booleano (True/False) indicando se o ícone encontra-se ativo ou não.
Somente Leitura
BalloonIcon

Opcional. Expressão numérica que indica o tipo de ícone a ser exibido no balão de mensagem do System Tray. O valor padrão é 0 (zero).

Ícone
Valor
Constante
0
trayNone
1
trayInformation
2
trayExclamation
3
trayCritical
4
trayDefinedUser (ícone defino pelo usuário na propriedade Icon)

BalloonText Opcional. Expressão de seqüência de caracteres exibida como mensagem no Balão de Mensagem.
Se omitir, o Balão de Mensagem não será exibido.
BalloonTitle Opcional. Expressão de seqüência de caracteres exibida como título no Balão de Mensagem.
Icon Obrigatória. Expressão de seqüência de caracteres indicando o caminho completo inclusive a sua extensão (*.ico) do ícone a ser exibido no SystemTray.
Se omitir, causará um erro.
Id Opcional. Expressão numérica para indicar um valor de identificação para o SystemTray.
Caso você deseje exibir mais de um ícone no SystemTray, deverá informar valores distintos para cada um deles.
ToolTipText Opcional. Expressão de seqüência de caracteres exibida na caixa de mensagem quando o cursor do mouse se posiciona sobre o SystemTray.

MÉTODOS
Refresh Atualiza todas as propriedades definidas pelo usuário do SystemTray quando o mesmo se encontra ativo.
Se o valor da propriedade Activate for False e você chamar o método Refresh, causará um erro.
Show

Mostra o ícone e as propriedades definidas do SystemTray.

Sintaxe
Show(value_hWnd As Long)
O argumento value_hWnd é obrigatório. Identificador (um valor Long Integer exclusivo) atribuído pelo Microsoft Windows à janela atual.

Se o valor da propriedade Activate for False e você chamar o método Refresh, causará um erro.

Unload Remove o objeto SystemTray.
Se o valor da propriedade Activate for True e você chamar o método Refresh, causará um erro.

Veja um exemplo no código do meu Formulário:

Private Sub Form_Load()
Dim SysTray As New clsSystemTray
With SysTray .Icon = "C:\Documents and Settings\Cesar A Pinheiro _
& "\Meus documentos\StartNoDebug.ico"
.BalloonTitle = "Olá pessoal"
.BalloonText = "Vejam que legal!" & vbCrLf _
& "O meu ícone está ao lado do relógio do Windows."
.ToolTipText = "Você está com o mouse sobre eu"
.BalloonIcon = trayInformation
.Show (Me.hWnd) End With End Sub

Bom pessoal, finalizamos por aqui e espero que este artigo seje de grande utilidade para vocês.
Se desejarem deixar algum comentário acessem meu blog: http://cesarapinheiro.wordpress.com
Agradeço a todos e principalmente a Deus por mais esta oportunidade.

César Augusto Pinheiro

César Augusto Pinheiro - Atualmente um mero estagiário do banco HSBC. Automatiza os processos financeiros da instituição utilizando os recursos do VBA (Visual Basic Application) dos aplicativos do Microsoft Office como o Microsoft Access e Microsoft Excel.
Desenvolve em Visual Basic 6 desde o ano de 2000, está se formando em Análise e Desenvolvimento de Sistemas na Universidade Camilo Castelo Branco em São Paulo.