CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 7 of 7
  1. #1

    Taskbar and Tray

    How do I place an icon in the task tray when my program is minimized?


  2. #2
    Join Date
    Dec 1999
    Location
    Austria
    Posts
    17

    Re: Taskbar and Tray

    place this into a module:

    'user defined type required by Shell_NotifyIcon API call
    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

    'constants required by Shell_NotifyIcon API call:
    Public Const NIM_ADD = &H0
    Public Const NIM_MODIFY = &H1
    Public Const NIM_DELETE = &H2
    Public Const NIF_MESSAGE = &H1
    Public Const NIF_ICON = &H2
    Public Const NIF_TIP = &H4
    Public Const WM_MOUSEMOVE = &H200

    Public Const WM_LBUTTONDOWN = &H201 'Button down Public Const WM_LBUTTONUP = &H202 'Button up
    Public Const WM_LBUTTONDBLCLK = &H203 'Double-click
    Public Const WM_RBUTTONDOWN = &H204 'Button down
    Public Const WM_RBUTTONUP = &H205 'Button up
    Public Const WM_RBUTTONDBLCLK = &H206 'Double-click
    Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Public Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" _
    (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
    Public nid As NOTIFYICONDATA

    place this into Form_load():

    'ShowTray-Icon!
    Me.Show
    Me.Refresh
    With nid

    .cbSize = Len(nid)
    .hwnd = Me.hwnd
    .uId = vbNull
    .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
    .uCallBackMessage = WM_MOUSEMOVE
    .hIcon = Me.Icon
    .szTip = "Stundenabrechnungsprogramm" & vbNullChar
    End With
    Shell_NotifyIcon NIM_ADD, nid

    and the 3rd step:
    Private Sub Form_Resize() 'this is necessary to assure that the minimized window is hidden End Sub
    If Me.WindowState = vbMinimized Then Me.Hide
    End Sub



  3. #3

    Re: Taskbar and Tray

    The only question I have now is how do I capture the event of the user clicking on my status area icon? Do you know of any good documentation on such things?


  4. #4
    Join Date
    May 1999
    Location
    Oxford UK
    Posts
    1,459

    Re: Taskbar and Tray

    That code *almost* works how you want it - here's a refined version that'll do what you want:

    In a BAS module, place the following code :


    option Explicit

    'user defined type required by Shell_NotifyIcon API call
    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

    'constants required by Shell_NotifyIcon API call:
    public Const NIM_ADD = &H0
    public Const NIM_MODIFY = &H1
    public Const NIM_DELETE = &H2
    public Const NIF_MESSAGE = &H1
    public Const NIF_ICON = &H2
    public Const NIF_TIP = &H4
    public Const WM_MOUSEMOVE = &H200

    public Const WM_LBUTTONDOWN = &H201 'Button down public Const WM_LBUTTONUP = &H202 'Button up
    public Const WM_LBUTTONDBLCLK = &H203 'Double-click
    public Const WM_RBUTTONDOWN = &H204 'Button down
    public Const WM_RBUTTONUP = &H205 'Button up
    public Const WM_RBUTTONDBLCLK = &H206 'Double-click
    public Declare Function SetForegroundWindow Lib "user32" (byval hwnd as Long) as Long
    public Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" _
    (byval dwMessage as Long, pnid as NOTIFYICONDATA) as Boolean
    public nid as NOTIFYICONDATA





    Now take a form (Form1) and place a PictureBox on it (Picture1). This picturebox will handle all the events from the task bar. Set the Picture1.visible property to false from the ide. Now paste in the following code :


    option Explicit

    private Sub Form_Load()
    '
    ' Create our system tray icon from the Form's icon
    '
    SetupSysTrayIcon
    End Sub

    private Sub Form_Resize()
    '
    ' If minimized, then hide the form
    '
    If me.WindowState = vbMinimized then me.Visible = false
    End Sub

    private Sub Form_Unload(Cancel as Integer)
    '
    ' Remember to kill the systray icon, otherwise it hangs around
    ' till we move a mouse pointer over it
    '
    KillSysTrayIcon
    End Sub

    private Sub SetupSysTrayIcon()
    on error GoTo vbErrorHandler
    '
    ' Setup the System Tray Icon
    '
    Dim tTrayStuff as NOTIFYICONDATA

    With tTrayStuff
    .cbSize = len(tTrayStuff)
    .hwnd = Picture1.hwnd
    .uId = 1&
    .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
    .uCallBackMessage = WM_MOUSEMOVE
    .hIcon = me.Icon
    .szTip = "Your Tooltip Goes Here" & vbNullChar
    Shell_NotifyIcon NIM_ADD, tTrayStuff
    End With

    Exit Sub

    vbErrorHandler:
    MsgBox Err.Number & " " & Err.Description & " " & _
    Err.Source & "::Form1_SetupSysTrayIcon", , App.ProductName
    End Sub


    private Sub KillSysTrayIcon()
    Dim t as NOTIFYICONDATA
    '
    ' Kill the icon in the system tray
    '
    With t
    .cbSize = len(t)
    .hwnd = Picture1.hwnd
    .uId = 1&
    End With

    Shell_NotifyIcon NIM_DELETE, t

    End Sub

    private Sub Picture1_MouseMove(Button as Integer, Shift as Integer, x as Single, y as Single)
    '
    ' Here's where we handle the Icon Tray Messages
    '
    Dim lMsg as Long
    '
    ' Because of possible recursion - use a static flag
    '
    static bInHere as Boolean

    on error GoTo vbErrorHandler
    '
    ' The actual message is stored in the 'x' value - the correct
    ' way to get the messages is to subclass, but this hack works
    ' in VB5/6 so it'll do for now.
    '
    lMsg = x / Screen.TwipsPerPixelX

    If bInHere then Exit Sub

    bInHere = true

    Select Case lMsg
    Case WM_LBUTTONDBLCLK:
    '
    ' on Mouse DoubleClick - Restore the window
    '
    on error resume next
    me.Visible = true

    If me.WindowState = vbMinimized then
    me.WindowState = vbDefault
    End If
    me.ZOrder
    me.Visible = true

    End Select

    bInHere = false

    Exit Sub

    vbErrorHandler:
    MsgBox Err.Number & " " & Err.Description & " " & Err.Source & _
    " test:icture1_MouseMove", , App.ProductName
    End Sub




    - That's it.



    Chris Eastwood

    CodeGuru - the website for developers
    http://codeguru.developer.com/vb

  5. #5

    Re: Taskbar and Tray

    I do I use subclassing if that's actually the correct way of doing this? How do I create a right click menu? I understand how to implement it but not how to create it. Thank you to those that have helped me.


  6. #6
    Join Date
    Oct 1999
    Location
    CA
    Posts
    91

    Re: Taskbar and Tray

    Making a popup menu is easy. Use the menu builder and create the menu that you would like to popup (if you already have a working menu that you would like to use, then that'll work).

    Then on the mouse down, click, whatever events just use me.popupmenu

    Peice of cake!

    Brewguru99

  7. #7
    Join Date
    Dec 1999
    Location
    Austria
    Posts
    17

    Re: Taskbar and Tray

    forgot yesterday (sorry):

    private Sub Form_MouseMove(Button as Integer, Shift as Integer, X as Single, Y as Single)
    'callbacks from the System Tray icon.
    Dim Result as Long
    Dim msg as Long 'the value of X will vary depending upon the scalemode setting
    If me.ScaleMode = vbPixels then
    msg = X
    else
    msg = X / Screen.TwipsPerPixelX
    End If

    Select Case msg
    Case WM_LBUTTONUP '514 restore form window
    me.WindowState = vbNormal
    Result = SetForegroundWindow(me.hwnd)
    me.Show
    Case WM_LBUTTONDBLCLK '515 restore form window
    me.WindowState = vbNormal
    Result = SetForegroundWindow(me.hwnd)
    me.Show
    Case WM_RBUTTONUP '517 display popup Menu
    Result = SetForegroundWindow(me.hwnd)
    PopupMenu mnuFile
    End Select

    End Sub





Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured