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:

Code: Alles auswählen

nId\cbSize = SizeOf(NOTIFYICONDATA_)
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. :allright:

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 :mrgreen: