Notify : Notification en bas à droite du moniteur.

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Notify : Notification en bas à droite du moniteur.

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

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

Message 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.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message par Kwai chang caine »

Marche aussi sous W7
Merci 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

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

Message 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).

:)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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é.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre