'''''''' Önce projenize bir module ekleyin ve aşağıdaki kodları yazın;
'''''''' Kullanacağımız API ve değişkenlerin tanımlamalarını yapıyoruz.
Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As Menu
Declare Function CallWindowProc Lib "User32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Public Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202
Public Const WM_MBUTTONUP = &H208
Public Const WM_RBUTTONUP = &H205
Public Const TRAY_CALLBACK = (WM_USER + 1001&)
Public Const GWL_WNDPROC = (-4)
Public Const GWL_USERDATA = (-21)
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIF_MESSAGE = &H1
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
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
End Type
Private TheData As NOTIFYICONDATA
Private Declare Function SetForegroundWindow Lib "User32" (ByVal hWnd As Long) As Long
Private Declare Function PostMessage Lib "User32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_NULL = &H0
Public Function NewWindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_NCDESTROY = &H82
Const WM_SYSCOMMAND = &H112
Const SC_MAXIMIZE = &HF030&
Const SC_MINIMIZE = &HF020&
Const SC_RESTORE = &HF120&
'''''''' Form kapanıyorsa traydeki iconu kaldırıyoruz, siz yine de formunuzun unload olayına TraydenAl yazmayı unutmayın.
If Msg = WM_NCDESTROY Then
TraydenAl
ElseIf Msg = TRAY_CALLBACK Then
'''''''' Sol Tıkla Program açılıyor, bu özelliği istemezseniz sonunda ''''''''<<< olan satırları silin
If lParam = WM_LBUTTONUP Then ''''''''<<<
TheForm.Show ''''''''<<<
If TheForm.WindowState = vbMinimized Then TheForm.WindowState = TheForm.LastState ''''''''<<<
TheForm.SetFocus ''''''''<<<
End If ''''''''<<<
'''''''' Sağ tıkla menu açılıyor
If lParam = WM_RBUTTONUP Then
SetForegroundWindow TheForm.hWnd
TheForm.PopupMenu TheMenu
If Not (TheForm Is Nothing) Then
PostMessage TheForm.hWnd, WM_NULL, ByVal 0&, ByVal 0&
End If
Exit Function
End If
End If
'''''''' Form minimize olursa veya eski haline gelirse görünüm ve menu düzenleniyor
If Msg = WM_SYSCOMMAND Then
If wParam = SC_MINIMIZE Then
TheForm.Hide
TheForm.SetTrayMenuItems vbMinimized
Exit Function
ElseIf wParam = SC_RESTORE Then
If Not TheForm.Visible Then
TheForm.Show
TheForm.SetTrayMenuItems vbNormal
Exit Function
End If
End If
End If
NewWindowProc = CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam)
End Function
'''''''' Traye icon eklerken çağıracağımız Sub
Public Sub TrayeEkle(frm As Form, mnu As Menu)
Set TheForm = frm
Set TheMenu = mnu
OldWindowProc = SetWindowLong(frm.hWnd, GWL_WNDPROC, AddressOf NewWindowProc)
With TheData
.uID = 0
.hWnd = frm.hWnd
.cbSize = Len(TheData)
.hIcon = frm.Icon.Handle
.uFlags = NIF_ICON
.uCallbackMessage = TRAY_CALLBACK
.uFlags = .uFlags Or NIF_MESSAGE
.cbSize = Len(TheData)
End With
Shell_NotifyIcon NIM_ADD, TheData
End Sub
'''''''' Iconu trayden kaldırırken çağıracağımız Sub
Public Sub TraydenAl()
With TheData
.uFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData
SetWindowLong TheForm.hWnd, GWL_WNDPROC, OldWindowProc
Set TheForm = Nothing
End Sub
'''''''' Iconun Balonunu eklerken veya değiştirirken çağıracağımız Sub
Public Sub TrayBalonu(tip As String)
With TheData
.szTip = tip & vbNullChar
.uFlags = NIF_TIP
End With
Shell_NotifyIcon NIM_MODIFY, TheData
End Sub
'''''''' Iconu değiştirirken çağıracağımız Sub
Public Sub YeniTrayIcon(pic As Picture)
If pic.Type <> vbPicTypeIcon Then Exit Sub
With TheData
.hIcon = pic.Handle
.uFlags = NIF_ICON
End With
Shell_NotifyIcon NIM_MODIFY, TheData
End Sub
'''''''' Formun içine ise aşağıdaki kodları yazın;
Public Sub SetTrayMenuItems(window_state As Integer)
'''''''' Module tarafından traydeki iconun menusunu düzenlemek için kullanılır
End Sub
'''''''' Şimdi, diyelim ki formumuzun adı Form1 ve icona eklemek istediğimiz menude menuPOP, o halde Traye icon eklemek için form içinde yazmamız gereken kod aşağıdaki gibi olur;
TrayeEkle Form1, Form1.menuPOP
'''''''' Form1 adlı formun iconunu alır ve saatin yanına ekler ve formun menuPOP adlı menusünü mouse tuşu ile icona tıklayınca açılmasını sağlar. (Formunuza icon eklemeyi unutmayın.)
'''''''' iconu kaldırmak için ise aşağıdaki kodu yazmanız gerekli;
TraydenAl
'''''''' Programınızın sorunsuz kapanması için iconu mutlaka kaldırmanız gerekir, bunuda yukarıdaki komutu formun unload olayına yazarak yapabilirsiniz.
'''''''' Mouse ile traydeki iconun üzerine gelince balon çıkmasını ve o balona istediğiniz bilgiyi yazmak isterseniz;
TrayBalonu
'''''''' kullanmalısınız, örneğin balonda tarihi yazdırmak istiyoruz;
TrayBalonu "Tarih: " & Date()
'''''''' yazarsanız, mouse icon üzerine gelince açılan balonda tarih yazacaktır. Siz istediğiniz bilgiyi yazabilirsiniz. Tray balonundaki bilgiyi istediğiniz zaman değiştirebilirsiniz.
'''''''' Traydeki iconu değiştirmek isterseniz;
YeniTrayIcon
'''''''' komutunu kullanmalısınız, örneğin command1 butonunun picture''''''''ına yüklediğimiz iconla değiştirelim;
YeniTrayIcon command1.picture
'''''''' Burada yalnızca icon kullanmaya dikkat edin.
''''''''------------------------------------------------------------
''''''''Şimdi diyelim ki, module''''''''ü hazırladınız ve projenize eklediniz, buyrun bir tane de örnek;
''''''''Formun adı Form1 olsun ve bir menu oluşturup menunun adını menuPOP yapın (captionı değil adını, yani menu hazırladığınız sayfadaki üstten ikinci satıra yazdığınız ve kodlamada kullandığınız adını), 1 adet Timer ve 1 adet button ekleyin, buttonun picture''''''''ına bir icon ekleyin ve sonra aşağıdaki kodları yazın;
Dim a
Private Sub Form_Load ()
Timer1.Interval = 1000
Timer1.Enabled = True
TrayeEkle Form1, Form1.menuPOP '''''''' Traye iconu ekledik
End Sub
Private Sub Form_Unload()
TraydenAl ''''''''Form kapatılırsa iconu kaldırıyoruz
End Sub
Private Sub Timer1_Timer()
TrayBalonu "Saat: " & Time() '''''''' Iconun balonuna saati ekliyoruz
if a = 0 then YeniTrayIcon command1.picture : a = 1 : exit sub ''''''''a sıfırsa iconu command1''''''''in picture''''''''ı ile değiştiriyor
YeniTrayIcon Me.Icon : a = 0 '''''''' a 1 se iconu formun iconu ile değiştiriyoruz
End Sub
'''''''' Başarılar.
leed ut
leedut