Seite 26 von 43
Re: WinAPI Library (Snippets) (548)
Verfasst: 04.10.2010 18:57
von Rudi
So einen SysTrayIconBalloonTip habe ich neulich nicht finden können. Hier ist ein Code, wie er so oder so ähnlich im Forum öfters zu finden ist. Ich weiß allerdings nicht, ob er auch unter Win7 geht. Das nId\cbSize wird ab Vista möglicherweise per SizeOf(NOTIFYICONDATA_) ermittelt.
Code: Alles auswählen
Structure NOTIFYICONDATA_
cbSize.l
hwnd.i
uId.l
uFlags.l
uCallbackMessage.l
hIcon.i
StructureUnion
szTip.c[64]
szTipEx.c[128]
EndStructureUnion
dwState.l
dwStateMask.l
szInfo.c[256]
StructureUnion
uTimeout.l
uVersion.l
EndStructureUnion
szInfoTitle.c[64]
dwInfoFlags.l
guidItem.GUID
hBalloonIcon.i
EndStructure
Procedure SysTrayIconBalloon(uId, hWindow, Title$, Message$, timeOut, flags)
Protected nId.NOTIFYICONDATA_
If OSVersion() >= #PB_OS_Windows_Vista
nId\cbSize = 508
ElseIf OSVersion() >= #PB_OS_Windows_XP
nId\cbSize = 504
ElseIf OSVersion() >= #PB_OS_Windows_2000
nId\cbSize = 488
Else
nId\cbSize = 88
EndIf
If nId\cbSize
nId\uVersion = 4
Shell_NotifyIcon_(#NIM_SETVERSION, @nId)
nId\uId = uId
nId\hwnd = hWindow
nId\dwInfoFlags = flags
nId\uFlags = #NIF_INFO
nId\uTimeout = timeOut
PokeS(@nId\szInfo, Message$, SizeOf(nId\szInfo))
PokeS(@nId\szInfoTitle, Title$, SizeOf(nId\szInfoTitle))
ProcedureReturn Shell_NotifyIcon_(#NIM_MODIFY, @nId)
EndIf
ProcedureReturn #False
EndProcedure
If OpenWindow(0,#PB_Ignore,#PB_Ignore,200,200,"BalloonTip",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
AddSysTrayIcon(0, WindowID(0), ExtractIcon_(0,"explorer.exe",3))
SysTrayIconBalloon(0, WindowID(0),"BalloonTip 1!","BalloonTip wechselt in drei Sekunden!",100,#NIIF_INFO)
Delay(3000)
SysTrayIconBalloon(0, WindowID(0),"BalloonTip 2!","BalloonTip verschwindet gleich!",100,#NIIF_WARNING)
Delay(3000)
SysTrayIconBalloon(0, WindowID(0),"","",100,#NIIF_INFO)
Delay(1000)
EndIf
Re: WinAPI Library (Snippets) (548)
Verfasst: 04.10.2010 22:20
von edel
Rudi hat geschrieben:Das nId\cbSize wird ab Vista möglicherweise per SizeOf(NOTIFYICONDATA_) ermittelt.
Wird man so oder so benutzen muessen, da es sonst mit Unicode nicht funktioniert.
Code: Alles auswählen
PokeS(@nId\szInfo, Message$, SizeOf(nId\szInfo))
PokeS(@nId\szInfoTitle, Title$, SizeOf(nId\szInfoTitle))
Das fuehrt frueher oder spaeter zu einem Fehler, da der String gar nicht so lang sein muss, wie in die Struktur passt.
Richtig waere es so
Code: Alles auswählen
PokeS(@nId\szInfo, Message$)
PokeS(@nId\szInfoTitle, Title$)
Alternativ kannst du auch .s{x} benutzen.
Code: Alles auswählen
Structure NOTIFYICONDATA_
[...]
szInfo.s{256}
[...]
EndStructure
[...]
nId\szInfo = Message$
[...]
Re: WinAPI Library (Snippets) (548)
Verfasst: 04.10.2010 23:03
von Rudi
@edel
Danke schon mal für die Hilfe.
Wird man so oder so benutzen muessen, da es sonst mit Unicode nicht funktioniert.
Vielleicht könnte noch ein Vista und/oder Win7 - Nutzer testen, ob das so funktioniert!
***Edit: Habe nochmal den gesamten Code mit den von edel vorgeschlagenen Veränderungen reinkopiert. Vielleicht erbarmt sich noch jemand; es ist doch für die WinAPI Library!
Code: Alles auswählen
Structure NOTIFYICONDATA_
cbSize.l
hwnd.i
uId.l
uFlags.l
uCallbackMessage.l
hIcon.i
StructureUnion
szTip.c[64]
szTipEx.c[128]
EndStructureUnion
dwState.l
dwStateMask.l
szInfo.s{256}
StructureUnion
uTimeout.l
uVersion.l
EndStructureUnion
szInfoTitle.c[64]
dwInfoFlags.l
guidItem.GUID
hBalloonIcon.i
EndStructure
Procedure SysTrayIconBalloon(uId, hWindow, Title$, Message$, timeOut, flags)
Protected nId.NOTIFYICONDATA_
If OSVersion() >= #PB_OS_Windows_Vista
nId\cbSize = SizeOf(NOTIFYICONDATA_)
ElseIf OSVersion() >= #PB_OS_Windows_XP
nId\cbSize = 504
ElseIf OSVersion() >= #PB_OS_Windows_2000
nId\cbSize = 488
Else
nId\cbSize = 88
EndIf
If nId\cbSize
nId\uVersion = 4
Shell_NotifyIcon_(#NIM_SETVERSION, @nId)
nId\uId = uId
nId\hwnd = hWindow
nId\dwInfoFlags = flags
nId\uFlags = #NIF_INFO
nId\uTimeout = timeOut
nId\szInfo = Message$
PokeS(@nId\szInfo, Message$)
PokeS(@nId\szInfoTitle, Title$)
ProcedureReturn Shell_NotifyIcon_(#NIM_MODIFY, @nId)
EndIf
ProcedureReturn #False
EndProcedure
If OpenWindow(0,#PB_Ignore,#PB_Ignore,200,200,"BalloonTip",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
AddSysTrayIcon(0, WindowID(0), ExtractIcon_(0,"explorer.exe",3))
SysTrayIconBalloon(0, WindowID(0),"BalloonTip 1!","BalloonTip wechselt in drei Sekunden!",100,#NIIF_INFO)
Delay(3000)
SysTrayIconBalloon(0, WindowID(0),"BalloonTip 2!","BalloonTip verschwindet gleich!",100,#NIIF_WARNING)
Delay(3000)
SysTrayIconBalloon(0, WindowID(0),"","",100,#NIIF_INFO)
Delay(1000)
EndIf
Das hier ist die entscheidende Zeile für Vista und Win7:
Unter XP funktioniert der Code.
Re: WinAPI Library (Snippets) (548)
Verfasst: 08.10.2010 17:26
von RSBasic
Hallo Rudi,
vielen Dank für deinen Code.
Unter Windows 7 funktioniert der Code einwandfrei.
Habs in meiner WinAPI-L.-Warteschlange hinzugefügt.
Und danke an edel für die Anpassung.
Re: WinAPI Library (Snippets) (548)
Verfasst: 08.10.2010 22:38
von Bisonte
Auf Win7 x64 läufts auch.
Hab grad heute nach soetwas suchen müssen, da ich mal schnell einen DyndnsUpdaterersatz bauen musste...

Re: WinAPI Library (Snippets) (548)
Verfasst: 08.10.2010 22:53
von Falko
Funktioniert bei mir auch unter Vista Ultimate 32-Bit.
Da ich Vista 64-Bit runter geschmissen habe, kann ich das
leider nicht mehr testen.
Gruß Falko
Re: WinAPI Library (Snippets) (548)
Verfasst: 09.10.2010 00:04
von edel
Unter Windows 64 bit funktioniert es nicht.
Re: WinAPI Library (Snippets) (548)
Verfasst: 09.10.2010 00:18
von Andreas21
Unter Windows 7 leuft es.
Aber nur unter 32 Bit.
Bei 64 bit gehts nicht.
Re: WinAPI Library (Snippets) (548)
Verfasst: 09.10.2010 21:24
von Rudi
Bitte nochmal testen auf x64:
Edit: Struktur geändert!
Code: Alles auswählen
Structure NOTIFYICONDATA_
cbSize.l
hwnd.l
uID.l
uFlags.l
uCallbackMessage.l
hIcon.l
szTip.s{128}
dwState.l
dwStateMask.l
szInfo.s{256}
StructureUnion
uTimeout.l
uVersion.l
EndStructureUnion
szInfoTitle.s{64}
dwInfoFlags.l
guidItem.GUID
hBalloonIcon.i
EndStructure
Procedure SysTrayIconBalloon(uId, hWindow, Title$, Message$, timeOut, flags)
Protected nId.NOTIFYICONDATA_
If OSVersion() >= #PB_OS_Windows_Vista
nId\cbSize = SizeOf(NOTIFYICONDATA_)
ElseIf OSVersion() >= #PB_OS_Windows_XP
nId\cbSize = #NOTIFYICONDATA_V3_SIZE
ElseIf OSVersion() >= #PB_OS_Windows_2000
nId\cbSize = #NOTIFYICONDATA_V2_SIZE
Else
nId\cbSize = #NOTIFYICONDATA_V1_SIZE
EndIf
If nId\cbSize
nId\uVersion = 4
Shell_NotifyIcon_(#NIM_SETVERSION, @nId)
nId\uId = uId
nId\hwnd = hWindow
nId\dwInfoFlags = flags
nId\uFlags = #NIF_INFO
nId\uTimeout = timeOut
nId\szInfo = Message$
nId\szInfoTitle = Title$
ProcedureReturn Shell_NotifyIcon_(#NIM_MODIFY, @nId)
EndIf
ProcedureReturn #False
EndProcedure
If OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 200, "BalloonTip", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
AddSysTrayIcon(0, WindowID(0), ExtractIcon_(0, "explorer.exe", 3))
SysTrayIconBalloon(0, WindowID(0), "BalloonTip 1!", "BalloonTip wechselt in drei Sekunden!", 100, #NIIF_INFO)
Delay(3000)
SysTrayIconBalloon(0, WindowID(0), "BalloonTip 2!", "BalloonTip verschwindet gleich!", 100, #NIIF_WARNING)
Delay(3000)
SysTrayIconBalloon(0, WindowID(0), "", "", 100, #NIIF_NONE)
Delay(1000)
EndIf
End
Re: WinAPI Library (Snippets) (548)
Verfasst: 09.10.2010 21:47
von ts-soft
Unter Windows 64 bit funktioniert es nicht.
Kein Wunder bei der falschen Struktur
