Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0542: Ballon-Info realisieren in Windows 2k und XP

 von 

Beschreibung 

Wer Windows 2000 oder Windows XP kennt, der kennt auch die Fehlermeldungen á la "Zu wenig Speicherplatz auf Laufwerk C". Diese werden in Sprechblasen über dem Infobereich der Taskleiste angezeigt. Wer soetwas auch in seinem Programm nutzen will, ist hier richtig!

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

Shell_NotifyIconA (Shell_NotifyIcon)

Download:

Download des Beispielprojektes [5,18 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'----------- Anfang Projektdatei balloontips.vbp  -----------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command3"
' Steuerelement: Bildfeld-Steuerelement "Picture1"
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label5"
' Steuerelement: Beschriftungsfeld "Label4"
' Steuerelement: Beschriftungsfeld "Label3"
' Steuerelement: Beschriftungsfeld "Label2"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Sub Command1_Click()

With nf_IconData
        .cbSize = Len(nf_IconData)
        .hWnd = Me.Picture1.hWnd
        .uID = vbNull
        .uFlags = NIF_ICON Or NIF_INFO Or NIF_MESSAGE Or NIF_TIP
        .uCallbackMessage = WM_MOUSEMOVE
        .hIcon = Me.Picture1.Picture
        .szTip = "Ballon-Tip Beispiel" & vbNullChar 'QuickInfo des Symbols & vbNullChar
        .dwState = 0
        .dwStateMask = 0
   End With

   Shell_NotifyIcon NIM_ADD, nf_IconData
   'NIM_ADD wird verwendet, da ein neues Symbol im Infobereich  hinzugefügt wird


End Sub

Private Sub Command2_Click()
With nf_IconData
        .cbSize = Len(nf_IconData)
        .hWnd = Me.Picture1.hWnd
        .uID = vbNull
        .uFlags = NIF_ICON Or NIF_INFO Or NIF_MESSAGE Or NIF_TIP
        .uCallbackMessage = WM_MOUSEMOVE
        .hIcon = Me.Picture1
        .szTip = "Balloon Maker" & vbNullChar 'QuickInfo des Symbols & vbNullChar
        .dwState = 0
        .dwStateMask = 0
        'Text des BallonTips. Mehrzeilige Tips sind möglich (Zeilenwechsel: vbCrLf).
        'Am Ende muss ein Chr(0) angehängt werden.
        .szInfo = "Neue Mitteilung" & Chr(0)
        'Fettformatierte Überschrift des Balloon-Tips. & Chr(0)
        .szInfoTitle = "Hallo Welt" & Chr(0)
        'Benutzes Icon für den Balloon
        '(Info, Warnung oder Fehler)(NIIF_NONE, NIIF_INFO, NIIF_WARNING, NIIF_ERROR)
        .dwInfoFlags = NIIF_INFO
        'Zeit nachdem der Balloon spät. verschwinden soll (millisek.)
        .uTimeout = 1000
   End With
  'NIM_MODIFY wird verwendet, da das bestehende Symbol im Infobereich verändert wird
  '(Balloon wird angezeigt)
   Shell_NotifyIcon NIM_MODIFY, nf_IconData
End Sub

Private Sub Command3_Click()
   'NIM_DELETE wird verwendet, da das bestehende Symbol aus Infobereich gelöscht wird
   Shell_NotifyIcon NIM_DELETE, nf_IconData

End Sub

Private Sub Form_Load()

End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--- Anfang Modul "modDeclaration" alias modDeclaration.bas ---
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
   dwState As Long
   dwStateMask As Long
   szInfo As String * 256
   uTimeout As Long
   szInfoTitle As String * 64
   dwInfoFlags As Long
End Type

Public nf_IconData As NOTIFYICONDATA

Public Const NOTIFYICON_VERSION = 3
Public Const NOTIFYICON_OLDVERSION = 0

Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2

Public Const NIM_SETFOCUS = &H3
Public Const NIM_SETVERSION = &H4

Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4

Public Const NIF_STATE = &H8
Public Const NIF_INFO = &H10

Public Const NIS_HIDDEN = &H1
Public Const NIS_SHAREDICON = &H2

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
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
 
Public Declare Function Shell_NotifyIcon Lib "shell32" _
Alias "Shell_NotifyIconA" _
(ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean



'--- Ende Modul "modDeclaration" alias modDeclaration.bas ---
'------------ Ende Projektdatei balloontips.vbp  ------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 28 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Bernd Baumbach am 21.11.2009 um 23:53

Frage:
kann ich diese Ballon-Info auch über schalter etc. mit
hwnd-Eigenschaft setzen.
besonders interessant ist für mich die möglichkeit diese
Ballon-Info über "x" zu beenden.
oder gibt es eine möglichkeit "x" auch in mehrzeilige tooltips zu platzieren?

Kommentar von VBEinsteiger am 01.06.2008 um 17:22

Der Tipp is ja nicht schlecht.
Ich hab mir ein Programm zusammengebastelt
und das soll mit einem Klick auf einen Menüeintrag
ausgeblendet werden, das Programmsymbol im Tray anzeigen und einen passenden Balloon-Tip anzeigen. Das geht ja schon mal. Könnte mir nur einer ein Stückchen Code schicken, wie man das Programm bei einem Doppelklick auf das Symbol wieder einblendet?
Wäre echt toll.
Mfg, Ein VBEinsteiger :-)

Kommentar von Gerke Herrmann am 06.10.2006 um 08:08

Der Tip funktioniert einwandfrei. Super Ding.

Bloß habe ich das Problem, das egal wieviel Millisekunden ich angebe, der Balloon immer die vollen 10 Sekunden angezeigt wird.
Woran kann es liegen, das "uTimeout" überhaupt nicht beachtet wird ?

Vielen Dank im Vorraus

Gerke Herrmann

Kommentar von Jochen Wierum am 27.07.2005 um 09:34

An Ivory:
Ich habe mal folgendes Probiert:

' Button hinuzfügen: Command4
Private Sub Command4_Click()
With nf_IconData
.szInfo = Chr(0) ' Text: keiner
.szInfoTitle = Chr(0) ' Überschrift: Keine
.uTimeout = 0 ' Timeout: sofort
End With

' NIM_MODIFY wird verwendet, da das bestehende Symbol im Infobereich
' verändert wird (Balloon wird ausgeblendet)
Shell_NotifyIcon NIM_MODIFY, nf_IconData
End Sub


Wie es scheint, setzt das den Ballon zurück.
Vielleicht hilft dir das weiter!

Jochen Wierum

Kommentar von Ivory am 27.07.2005 um 01:27

Das ganze soll wohl mit Einschränkungen seitens der Icons ab Windows NT4 / Windows 95 funktionieren.
Siehe dazu die MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/structures/notifyicondata.asp

Aber mal ne Frage: wie kann ich das Tray-Icons aktualisieren/ändern, ohne das die Blase eingeblendet wird?
Z.B.: Anwendung runter in den Tray. Bei gewissen Aktionen der Anwendung soll das Icon von Grün auf Rot gehen. Nur ich erhalte dann immer wieder die Blase. Wie kann ich das verhindern?

Ciao

Kommentar von am 01.04.2005 um 01:06

funktioniert leider in .NET nicht

Kommentar von Fab am 17.03.2005 um 08:54

@Mæster
Mit dem folgenden Code kann man den balloon wieder ausblenden:

With nf_IconData
.cbSize = Len(nf_IconData)
.hWnd = Me.Picture1.hWnd
.uID = vbNull
.uFlags = NIF_ICON Or NIF_INFO Or NIF_MESSAGE Or NIF_TIP
.uCallbackMessage = WM_MOUSEMOVE
.hIcon = Me.Picture1
.szTip = "Balloon Maker" & vbNullChar
.dwState = 0
.dwStateMask = 0
.szInfo = Chr(0)
.szInfoTitle = Chr(0)
.dwInfoFlags = NIIF_NONE
.uTimeout = 0
End With

Shell_NotifyIcon NIM_MODIFY, nf_IconData

Kommentar von nick256 am 14.02.2005 um 21:11

ich kann aber keine normalen WS anpingen nur webserver ... :-(

gibts da eine lösung ?

Kommentar von BenniVB am 04.02.2005 um 18:23

@Mæster:
Das Timeout hab ich bis jetzt auch noch nicht wirklich zum Funktionieren gebracht. Vergiss es einfach - das braucht man so gut wie nie. Jeden Timeout kann man auch anders realisieren.
Wie man die Balloons über Code ohne einem Reload des Icons schließen kann, weiß ich nicht. Irgendwie muss es gehen.
Vielleicht wenn du einen Klick auf den Balloon simulierst. Ist zwar eine eigenartige Methode, aber vielleicht gehts ja...

Kommentar von Mæster am 04.02.2005 um 15:59

Gibt es eine Möglichkeit, den Balloon per Code zu schlieszen ohne das Icon zu löschen und wiedereinzustellen? Bei mir haut auch das Timeout des Balloons nicht hin.

Kommentar von Rainer Kirsch am 08.10.2004 um 23:50

Toller Tip,

ein Klick auf den Balloon kann über &H405 abgefragt werden, ein Klick auf den Schließen-Button des Balloon's kann über &H404 abgefragt werden.

Kommentar von Björn Tschörtner am 13.04.2004 um 17:00

Der Tipp funktioniert auch auf Windows ME (VB6 SP6) !!

Kommentar von Frans Nagel am 18.11.2003 um 15:17

Viele Dank,
ich bin ein programmeur im Holland,und deshalbe ist meiner Deutsch nicht sehr gut, und erst hier sahe ich dass der NOTIFYICONDATA struct im MSDN nicht stimmt(szTip[64] stat szTip[128]).
Nun wirkt es auch in C++

Kommentar von BenniVB am 30.10.2003 um 16:25

@Franz: In den Labels ist eine kleine Anleitung enthalten. Lad dir das Projekt herunter, dann siehst dus.
Für die Funktion des eigentlichen Codes spielen weder die Labels noch die CommandButtons eine Rolle. Nur die PictureBox ist zwingend notwendig, kann aber durch jedes andere Objekt mit einem hwnd ersetzt werden.

Kommentar von Franz Grillmeier am 30.10.2003 um 11:48

Eine Frage zu den verwendeten Controls:
Wozu sind eigentlich die Labels (1-5) gut?

Kommentar von BeniniVB am 29.06.2003 um 11:32

@ Getzy:
Folgende Voraussetzungen gibt es:

mind. Windows 2000/XP/2003 (hab gehört, dass es auch mit ME geht, konnte es aber noch nicht testen. (glaub es aber nicht)

Die Balloon-Tipps müssen aktiviert sein. Am einfachsten prüfst du das mit TweakUI für Windows XP, das du bei Microsoft US downloaden kannst.





Kommentar von Getzy am 28.06.2003 um 17:15

Das icon ist zwar da, aber kommt leider kein Ballon Tipp. :(

Kommentar von BenniVB am 12.05.2003 um 19:36

@Joseph: Das geht nicht, da diese Balloons vollständig von der Traybar abhängig sind. Aber es gibt in Windows XP (nicht 2000!!) eine möglichkeit, Balloons, die auf Text- & und ComboBoxen zeigen, einzublenden, wie das ja in XP auch von M$ häufig gerbraucht wird. Wenn du magst kann ich dir den Code dazu schicken.

Kommentar von Balicki am 12.05.2003 um 10:37

Hallo, wie kann ich den Ballon zum Punkt (X,Y) verschieben (MauseClick -parameter X, Y) ?

Gruß, Joseph


Kommentar von BenniVB am 16.04.2003 um 20:09

Ich weiß zwar keine wirklich elegante Lösung, aber spontan fällt mir dazu Folgendes ein: Wie wär's, wenn du einfach einen Klick auf die Sprechblase simulierst. Denn da verschwindet sie ja bekanntlich.

War nur so eine Idee. Aber vielleicht ist es ja die einzige Möglichkeit. :-)

Kommentar von Fabian am 16.04.2003 um 19:56

Hallo, weiß jemand wie ich die Sprechblase wieder verschwinden / ändern kann? Unter XP funktioniert dies ohne Probleme mit dem Tipp von BenniVB. Aber leider unter Windows 2k nicht. Dort werde die Änderungen nämlich gebuffert und in einem Zyklus, ( ca. 10 Sekunden) durchgefahren. Somit kann ich keinen Status in Echtzeit in der Blase anzeigen lassen.

Kommentar von Benni am 13.04.2003 um 22:14

@StefanR: Nein, das Aussehen richtet sich nach dem aktiven VisualStyle und den Farn-Einstellung in dem Darstellungs-Optionen. Es gibt aber ein haufen nachgebildeter Sprechblasen im Internet, die ie Veränderubg des aussehend verändern. Such mal.

@McChef: Doch, man kann den Klick auf den Balloon festellen, so wie das Windows ja auch oft nutzt. Dazu muss man den Balloon subclassen. Ist nicht ganz einfach, aber hier steht alles dazu: http://www.mvps.org/vbnet/code/subclass/shellnotifyballoontipclick.htm

Gruß, benni

Kommentar von Stefan R. am 13.04.2003 um 20:27

hallo, wie kann ich das aussehen ändern .. oder geht das nicht?

Kommentar von McChef am 11.02.2003 um 15:44

Kann zwar den Klick auf den Balloon nicht feststellen aber folgendes im MOUSEMOVE-Ereignis der Picturebox gibt Auskunft, ob auf das Tray-Icon selbst geklickt wurde und mit welcher Maustaste:

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Select Case X / Screen.TwipsPerPixelX
Case WM_LBUTTONUP
MsgBox "Sie haben mit der " & _
"linken Maustaste auf das " & _
"TrayIcon geklickt"
Case WM_RBUTTONUP
MsgBox "Sie haben mit der " & _
"rechten Maustaste auf das " & _
"TrayIcon geklickt"
End Select

End Sub

Kommentar von BenniVB am 01.02.2003 um 21:49

@Ralph:
Meines Wissens nach, gibt es keine Rückmeldung, wenn der Balloon geschlossen wird.
Aber Ausblenden geht ganz einfach:
Du setzt die folgenden Attribute neu:
.szInfo = Chr(0)
.szInfoTitle = Chr(0)
.dwInfoFlags = NIIF_NONE
.uTimeout = 0

Habs zwar nicht ausprobiert, sollte aber so gehen. Zumindest ist dies der Weg, um Balloons wieder auszublenden.

Kommentar von Ralph am 22.01.2003 um 10:19

Kann mir jemand sagen wie und ob man ein Ereignis zurückbekommt wenn der Balloon Text geschlossen wird??? Oder wie kann ich den Balloon Text schließen...

Kommentar von Marcel Karger am 01.01.2003 um 13:03

Geht bei mir auch unter WinMe (mit VB6)

Kommentar von KingIR am 19.11.2002 um 16:09

Heul...!
Geht bei mir nicht, obwohl ich WinXP Pro und VB6 und die Balloons angestellt hab...
Wer hat Hilfe?