Tray-Icon -> Blase erzeugen

RamonR

Erfahrenes Mitglied
Hallo,

folgendes Problem:

ich habe in meiner Anwendung ein Formular, welches sich beim Minimieren als Icon in den XP-Tray setzt. (Kein Problem dank VBArchiv-Tutorial http://www.vbarchiv.net/archiv/tipp_details.php?pid=517 :)

Jetzt will ich zu bestimmten Anlässen eine Statusmeldung per Blase an diesem Tray-Icon ausgeben.

Ich habe mir schon folgendes Tutorial angesehen:

http://www.vbarchiv.net/archiv/tipp_details.php?pid=828

Leider bekomme ich es aber einfach nicht hin, für mein schon vorhandenes Tray-Icon eine Blase zu erzeugen.

Ich bin für jede Hilfe dankbar


Hier noch mein Modul zum Erzeugen des Tray-Icons:

Code:
Option Explicit

' alle benötigten API-Deklarationen
Public Declare Sub keybd_event Lib "user32" _
  (ByVal bVk As Byte, ByVal bScan As Byte, _
  ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Public Const KEYEVENTF_KEYUP = &H2
Public Const VK_LWIN = &H5B

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

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

' Konstanten für linke Maustaste
Public Const WM_LBUTTONDBLCLK = &H203   ' Doppelklick
Public Const WM_LBUTTONDOWN = &H201     ' Maus gedrückt
Public Const WM_LBUTTONUP = &H202       ' Maus losgelassen

' Konstanten für rechte Maustaste
Public Const WM_RBUTTONDBLCLK = &H206   ' Doppelklick
Public Const WM_RBUTTONDOWN = &H204     ' Maus gedrückt
Public Const WM_RBUTTONUP = &H205       ' Maus losgelassen

Public Declare Function Shell_NotifyIcon Lib _
  "shell32" Alias "Shell_NotifyIconA" ( _
  ByVal dwMessage As Long, _
  pnid As NOTIFYICONDATA) As Boolean

Public nid As NOTIFYICONDATA

Public Sub Erzeuge_TrayIcon(ByVal F As Form, Tooltip As String, FormHide As Boolean)
  With nid
    .cbSize = Len(nid)
    .hWnd = F.hWnd
    .uId = vbNull
    .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
    .uCallBackMessage = WM_MOUSEMOVE
    .hIcon = F.Icon
    .szTip = Tooltip
  End With
  Shell_NotifyIcon NIM_ADD, nid
  
  If FormHide = True Then
    F.Hide
  End If
End Sub
 
Danke, aber ich hab's heute im Laufe des Tages gelöst, geht direkt über den API-Call:

Ich poste mal die Lösung für alle die sich den Post mal anschauen solten, und mach dann hier dicht :)

Code:
Option Explicit

' benötigte API-Deklaration um Tray-Menü ohne Auswahl schließen zu können
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long

' alle benötigten API-Deklarationen
Public Declare Sub keybd_event Lib "user32" _
() '  (ByVal bVk As Byte, ByVal bScan As Byte, _
  ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Public Const KEYEVENTF_KEYUP = &H2
Public Const VK_LWIN = &H5B

Public Type NOTIFYICONDATA
    cbSize As Long
    hWnd As Long
    uID As Long
    uFlags As Long
    uCallbackMessage As Long
    hIcon As Long
    szTip As String * 128              ' Tooltip, wenn Mauszeiger auf Icon zeigt
    dwState As Long
    dwStateMask As Long
    szInfo As String * 256
    uTimeout As Long
    szInfoTitle As String * 64
    dwInfoFlags As Long
End Type

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

' *** Konstanten für Blase
Public Const NIF_INFO = &H10
Public Const NIIF_NONE = &H0
Public Const NIIF_WARNING = &H2
Public Const NIIF_ERROR = &H3
Public Const NIIF_INFO = &H1
Public Const NIIF_GUID = &H4
' ***

Public Const WM_MOUSEMOVE = &H200

' Konstanten für linke Maustaste
Public Const WM_LBUTTONDBLCLK = &H203   ' Doppelklick
Public Const WM_LBUTTONDOWN = &H201     ' Maus gedrückt
Public Const WM_LBUTTONUP = &H202       ' Maus losgelassen

' Konstanten für rechte Maustaste
Public Const WM_RBUTTONDBLCLK = &H206   ' Doppelklick
Public Const WM_RBUTTONDOWN = &H204     ' Maus gedrückt
Public Const WM_RBUTTONUP = &H205       ' Maus losgelassen

Public Declare Function Shell_NotifyIcon Lib _
  "shell32" Alias "Shell_NotifyIconA" ( _
  ByVal dwMessage As Long, _
  pnid As NOTIFYICONDATA) As Boolean

Public nid As NOTIFYICONDATA

Public Sub Erzeuge_TrayIcon(ByVal F As Form, Tooltip As String, Hide As Boolean)
    With nid
        .cbSize = Len(nid)
        .hWnd = F.hWnd
        .uID = vbNull
        .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
        .uCallbackMessage = WM_MOUSEMOVE
        .hIcon = F.Icon         ' Verwende Icon von übergebener Form
        .szTip = Trim(Tooltip)  ' Setze Tooltip
    End With
    Shell_NotifyIcon NIM_ADD, nid     ' Erzeuge Tray-Icon

    If Hide = True Then       ' Wenn Hide = true
        F.Hide                  ' Verstecke übergebene Form
    End If
End Sub

Public Sub Erzeuge_Blase(ByVal Titel As String, ByVal Message As String, ByVal Icon As Long, TimeOut As Long)
    With nid
        
        .uFlags = NIF_ICON Or NIF_INFO Or NIF_MESSAGE Or NIF_TIP    ' Flags für Icon + Blase
        .szInfoTitle = Titel & Chr(0)   'Fettformatierte Überschrift des Balloon-Tips. & Chr(0)
        .szInfo = Message & Chr(0)      'Text des BallonTips. ' Mehrzeilige Tips sind möglich (Zeilenwechsel: vbCrLf). Am Ende muss ' ein Chr(0) angehängt werden.
        .dwInfoFlags = Icon 'Benutzes Icon für den Balloon (Info, Warnung oder Fehler)(NIIF_NONE, NIIF_INFO, NIIF_WARNING, NIIF_ERROR)
        .uTimeout = TimeOut             ' Zeit nach der der Balloon später verschwinden soll (in msec.)
    End With
    Shell_NotifyIcon NIM_MODIFY, nid    ' Erzeuge Blase
End Sub

Public Sub Loesche_TrayIcon()
    Shell_NotifyIcon NIM_DELETE, nid    ' Lösche TrayIcon
End Sub
 
Nimm dir VB.net
Da kannste, seit Framework 2.0, diese Gelben Bläschen Easy erstellen. Visual Basic .NET Express ist kostenlos zum Download bereit und das kann ALLES was du eiglt brauchst zum Programmieren und hat auch sonst keine Einschränkungen...

Wenn du das hast kannst dich mal Schlau machen mit:

Code:
NotifyIcon1.Icon = Me.Icon
NotifyIcon1.Visible = True
NotifyIcon1.ShowBalloonTip(1000, "Titel!", "Text in der Blase", ToolTipIcon.Info)

dann musste lediglich noch die subs erstellen wie:
Code:
Private Sub NotifyIcon1_BalloonTipClicked(ByVal sender As System.Object, ByVal e As EventArgs) _
         Handles NotifyIcon1.BalloonTipClicked
         ' blabla
End Sub
um nur eins davon zu nennen :)
 
Zurück