Page 1 sur 1

Notify : Notification en bas à droite du moniteur.

Publié : mer. 24/févr./2016 17:21
par falsam
[Windows]

Ce code largement inspiré de ce qu'on peut trouver sur le forum anglophone permet d'afficher une notification en bas de votre écran et dans le centre de notification sous windows 10.

Une seule procédure.
- Notify(Title.s, Message.s, Flags = #NIM_MODIFY) Affiche une notification.

Sous Windows 10, la notification s'estompe après quelques secondes. L'utilisateur peut cliquer sur l'icone de fermeture.

La démo que je vous montre maintenant permet d'afficher un message de bienvenue lors de l’exécution du code et un message de fin quand on quitte l'application.

Code : Tout sélectionner

EnableExplicit

Enumeration Window
  #MainForm
EndEnumeration

CompilerSelect #PB_Compiler_Processor
    
  CompilerCase #PB_Processor_x86
    Structure NOTIFYICONDATA_
      cbSize.l
      hwnd.i
      uId.l
      uFlags.l
      uCallbackMessage.l
      hIcon.i
      szTip.s{128}
      dwState.l
      dwStateMask.l
      szInfo.s{256}
      StructureUnion
        uTimeout.l
        uVersion.l
      EndStructureUnion
      szInfoTitle.s{64}
      dwInfoFlags.i
      guidItem.GUID
      hBalloonIcon.i
    EndStructure
    
  CompilerCase #PB_Processor_x64
    Structure NOTIFYICONDATA_
      cbSize.l
      PB_Alignment1.b[4]
      hWnd.i
      uID.l
      uFlags.l
      uCallbackMessage.l
      PB_Alignment2.b[4]
      hIcon.i
      szTip.s{128}
      dwState.l
      dwStateMark.l
      szInfo.s{256}
      StructureUnion
        uTimeout.l
        uVersion.l
      EndStructureUnion
      szInfoTitle.s{64}
      dwInfoFlags.l
      guidItem.GUID
      hBalloonIcon.i
    EndStructure
    
CompilerEndSelect

Global SysTrayInfo.NOTIFYICONDATA_

Declare Start()
Declare Notify(Title.s, Text.s, Message = #NIM_MODIFY)
Declare OnClick()
Declare Exit()

Start()

Procedure Start()
  OpenWindow(#MainForm, 0, 0, 800, 600, "Demo ",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  LoadImage(0 ,#PB_Compiler_Home + "examples/sources/Data/world.png")
  
  ;Message de bienvenue
  Notify("Hello", "Bienvenue dans ce programme de démonstration. J’espère que ça vous plaira.", #NIM_ADD)
  
  BindEvent(#PB_Event_CloseWindow, @Exit())
  
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure Notify(Title.s, Message.s, Flags = #NIM_MODIFY)
  
  If OSVersion() >=#PB_OS_Windows_Vista
    SysTrayInfo\cbSize=SizeOf(NOTIFYICONDATA_)
  ElseIf OSVersion() >=#PB_OS_Windows_XP
    SysTrayInfo\cbSize=OffsetOf(NOTIFYICONDATA_\hBalloonIcon)
  ElseIf OSVersion() >=#PB_OS_Windows_2000
    SysTrayInfo\cbSize=OffsetOf(NOTIFYICONDATA_\guidItem)
  Else
    SysTrayInfo\cbSize=OffsetOf(NOTIFYICONDATA_\szTip) + SizeOf(NOTIFYICONDATA_\szTip)
  EndIf
  
  If SysTrayInfo\cbSize      
    SysTrayInfo\hwnd = WindowID(#MainForm)
    SysTrayInfo\uFlags = #NIF_INFO
    SysTrayInfo\dwInfoFlags=#NIIF_NONE|#NIIF_INFO
    SysTrayInfo\dwState=#NIS_SHAREDICON      
  EndIf
  
  SysTrayInfo\szInfoTitle=Left(Title, 63)
  SysTrayInfo\szInfo=Left(Message, 255)
  
  ProcedureReturn Shell_NotifyIcon_(Flags, @SysTrayInfo)
EndProcedure

Procedure Exit()
  Notify("Information","A bientôt.")
  End
EndProcedure
Pouvez vous me préciser si ce code fonctionne sous Windows 7 et sous Windows XP. Fonctionnant sous Windows 10, je pense que ça fonctionne aussi sous Windows 8. Merci d'avance pour vos retours.

Re: Notify : Notification en bas à droite du moniteur.

Publié : mer. 24/févr./2016 17:54
par Marc56
Ça marche sous XP :wink:

Il faut quand même une sacrée tartine (un toast :mrgreen: ) beurrée d'API pour faire afficher cette petite boite 8O
Ça explique probablement pourquoi ce n'est pas implémenté d'office dans PB.

Re: Notify : Notification en bas à droite du moniteur.

Publié : mer. 24/févr./2016 18:01
par Kwai chang caine
Marche aussi sous W7
Merci 8)

Re: Notify : Notification en bas à droite du moniteur.

Publié : mer. 24/févr./2016 18:13
par falsam
Merci pour vos commentaires. C'est génial.
Marc56 a écrit :Il faut quand même une sacrée tartine
Juste une déclaration de la structure et une procédure pour afficher la notification. On peut en faire un module ou un include.

Re: Notify : Notification en bas à droite du moniteur.

Publié : mer. 24/févr./2016 22:03
par falsam
Solution Module

Notify.pbi

Code : Tout sélectionner

DeclareModule Notify  
  Declare Notify(Window, Title.s, Text.s, Message = #NIM_MODIFY)
EndDeclareModule

Module Notify
  ;// Private
    CompilerSelect #PB_Compiler_Processor
      
    CompilerCase #PB_Processor_x86
      Structure NOTIFYICONDATA_
        cbSize.l
        hwnd.i
        uId.l
        uFlags.l
        uCallbackMessage.l
        hIcon.i
        szTip.s{128}
        dwState.l
        dwStateMask.l
        szInfo.s{256}
        StructureUnion
          uTimeout.l
          uVersion.l
        EndStructureUnion
        szInfoTitle.s{64}
        dwInfoFlags.i
        guidItem.GUID
        hBalloonIcon.i
      EndStructure
      
    CompilerCase #PB_Processor_x64
      Structure NOTIFYICONDATA_
        cbSize.l
        PB_Alignment1.b[4]
        hWnd.i
        uID.l
        uFlags.l
        uCallbackMessage.l
        PB_Alignment2.b[4]
        hIcon.i
        szTip.s{128}
        dwState.l
        dwStateMark.l
        szInfo.s{256}
        StructureUnion
          uTimeout.l
          uVersion.l
        EndStructureUnion
        szInfoTitle.s{64}
        dwInfoFlags.l
        guidItem.GUID
        hBalloonIcon.i
      EndStructure
      
  CompilerEndSelect
  
  Global SysTrayInfo.NOTIFYICONDATA_
  
  ;// Public
  Procedure Notify(Window, Title.s, Message.s, Flags = #NIM_MODIFY)
    
    If OSVersion() >=#PB_OS_Windows_Vista
      SysTrayInfo\cbSize=SizeOf(NOTIFYICONDATA_)
    ElseIf OSVersion() >=#PB_OS_Windows_XP
      SysTrayInfo\cbSize=OffsetOf(NOTIFYICONDATA_\hBalloonIcon)
    ElseIf OSVersion() >=#PB_OS_Windows_2000
      SysTrayInfo\cbSize=OffsetOf(NOTIFYICONDATA_\guidItem)
    Else
      SysTrayInfo\cbSize=OffsetOf(NOTIFYICONDATA_\szTip) + SizeOf(NOTIFYICONDATA_\szTip)
    EndIf
    
    If SysTrayInfo\cbSize      
      SysTrayInfo\hwnd = WindowID(Window)
      SysTrayInfo\uFlags = #NIF_INFO
      SysTrayInfo\dwInfoFlags=#NIIF_NONE|#NIIF_INFO
      SysTrayInfo\dwState=#NIS_SHAREDICON      
    EndIf
    
    SysTrayInfo\szInfoTitle=Left(Title, 63)
    SysTrayInfo\szInfo=Left(Message, 255)
    
    ProcedureReturn Shell_NotifyIcon_(Flags, @SysTrayInfo)
  EndProcedure
EndModule
■ Code de démonstration.

Code : Tout sélectionner

IncludeFile "notify.pbi"

#MainForm = 0

UseModule Notify
OpenWindow(#MainForm, 0, 0, 800, 600, "Demo ",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Notify(#MainForm, "Hello", "Bienvenue dans ce programme de démonstration. J'espére que ça vous plaira", #NIM_ADD)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: Notify : Notification en bas à droite du moniteur.

Publié : jeu. 25/févr./2016 0:18
par Ar-S
Peut-être parce que j'utilise classic shell ou peut-être parce que j'ai 2 barres d'outils l'une sur l'autre mais je ne vois que la fenêtre "Demo" qui apparait sans autre message.
Image

Re: Notify : Notification en bas à droite du moniteur.

Publié : jeu. 25/févr./2016 9:53
par Marc56
Ar-S a écrit :Peut-être parce que j'utilise classic shell ...
Perso depuis que j'ai migré de Windows 8(.1) à W10, j'ai enlevé Classic Shell. :wink:

L'exemple de falsam fonctionne très bien sur mon W10, mais je garde quand même mon toast maison pour mon Desk
(il n'utilise rien de spécial, juste une fenêtre sans bords et un timer, comme ça ça marche partout).

:)

Re: Notify : Notification en bas à droite du moniteur.

Publié : jeu. 25/févr./2016 10:20
par Ar-S
Et bien même si le menu s'est amélioré, je préfère encore 100x classic shell.
Je pense aussi au une fenêtre sans bord est le plus sûr pour ce genre de fonction. Avec un canvas on peut en plus faire un truc très personnalisé.

Re: Notify : Notification en bas à droite du moniteur.

Publié : jeu. 25/févr./2016 13:57
par falsam
je ne peux que conseiller d'utiliser le projet de deseven qui permet d'afficher des notifications dans les 4 coins de l’écran ainsi qu'en haut ou en bas de l’écran.

Trois fonctionnalités que j'aime bien.
- Personnalisation des notifications.
- Empiler les notifications.
- Cliquer sur une notification pour ouvrir une application par exemple ou un lien http.

:arrow: http://www.purebasic.fr/english/viewtop ... 96#p468296