IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Notification Windows Cliquable [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Notification Windows Cliquable
    Bien le bonjour !

    Comme "beaucoup" je cherche une solution en python pour appeler une fonction lorsque je clique sur une notification windows !
    J'ai trouvé quelques informations en Visual C++ mais je n'y comprends pas grand chose et surtout je ne vois pas comment adapter ça à Python...

    Pour commencer, j'utilise le module plyer, voici le code utilisé par ce module pour générer une notification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
            # add icon and messages to window
            hicon = self._hicon
            flags = NIF_TIP | NIF_INFO
            icon_flag = 0
     
            if hicon is not None:
                flags |= NIF_ICON
     
                # if icon is default app's one, don't display it in message
                if self._balloon_icon is not None:
                    icon_flag = NIIF_USER | NIIF_LARGE_ICON
     
            notify_data = win_api_defs.get_NOTIFYICONDATAW(
                0, self._hwnd,
                id(self), flags, 0, hicon, app_name, 0, 0, message,
                NOTIFYICON_VERSION_4, title, icon_flag, win_api_defs.GUID(),
                self._balloon_icon
            )
     
            self._notify_data = notify_data
            if not win_api_defs.Shell_NotifyIconW(NIM_ADD, notify_data):
                raise Exception('Shell_NotifyIconW failed.')
            if not win_api_defs.Shell_NotifyIconW(NIM_SETVERSION,
                                                  notify_data):
                raise Exception('Shell_NotifyIconW failed.')
    Ensuite, voici la documentation Windows sur le NOTIFYICONDATAW : Lien
    Si je ne dis pas de connerie, l'argument intéressant est l'uCallbackMessage (cf. lien) ?

    J'ai donc cherché une façon de l'exploité pour récupérer le clic et je suis tombé sur un poste de 2003 qui explique la manipe en Visual C++ : Lien

    In your NOTIFYICONDATA make sure your uFlags contains NIF_MESSAGE and that the uCallbackMessage contains the message you want to be send to you when you click on the tray icon.
    Example:
    somewhere define the following:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MYWM_NOTIFYICON (WM_APP+100)

    Now, to add your icon to the tray do:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    NOTIFYICONDATA tnd = {0};
     
    tnd.cbSize = sizeof(NOTIFYICONDATA);
    tnd.hWnd = hWnd;   // Your hwnd
    tnd.uID = nID;  // Some ID
    tnd.uFlags = NIF_MESSAGE | otherFlags;
    tnd.uCallbackMessage = MYWM_NOTIFYICON;
    tnd.hIcon = hIcon;  // your icon handle
    Shell_NotifyIcon(NIM_ADD, &tnd);

    In your WindowProc do:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    switch (message)
    {
    case MYWM_NOTIFYICON:
    	switch (lParam)
    	{
    	case WM_RBUTTONUP:
    		// Right mouse button upped
    		break;
    	case WM_MBUTTONUP:
    		// Middle button upped
    		break;
    	case WM_LBUTTONUP:
    		// left button upped
    		break;
    	}
    	break;
    }
    Et donc maintenant que dois-je faire pour adapter ça en python ?

    J'ai trouvé que WM_APP = 0x8000 mais bon voila, je suis pas plus avancé... Le 2ème bout de code ça va, j'ai déjà ce qu'il faut ou presque mais le dernier ???

    Merci à ceux qui pourraient nous aider dans cette quête qui dure depuis des années ! ^^
    Dernière modification par Invité ; 07/11/2019 à 22h28. Motif: Mise en forme de la citation

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si par "je clique sur une notification windows", il faut comprendre "je clique sur une icône dans la zone de notification de Windows", alors j'utilise ça couramment.

    Je fais ça avec la bibliothèque graphique PyQt5. C'est la classe qui s'appelle "QSystemTrayIcon" qui permet cette fonctionnalité.

    J'utilise ça pour plusieurs applications sur mon PC (Windows 10). L'une d'entre elles est un lecteur de radios internet. Lorsque je clique (clic gauche) sur l'icône, une petite fenêtre s'affiche qui permet de sélectionner et de lancer l'une des radios. La fermeture de cette fenêtre ne fait que la cacher (.hide), ce qui fait qu'elle est toujours en exécution, mais qu'elle ne prend pas de place sur le bureau. Avec un clic droit sur la même icône, il s'affiche un petit menu qui permet de mettre en pause l'écoute, de la relancer ou de quitter l'application. Ma dernière version permet d'appeler un petit éditeur de texte (avec PyQt5 aussi) pour gérer la liste des radios. A noter qu'on peut écouter aussi des mp3 sur le disque dur ou dans le réseau local.

    Ce programme est rendu autonome (".exe") avec pyinstaller, c'est à dire qu'il peut s'exécuter sur un PC qui n'a pas Python d'installé (ou qui a une autre version de Python!). Ce n'est pas une compilation comme avec C++, mais une "encapsulation" du programme avec son interpréteur Python et les modules nécessaires à son exécution.

    De plus, il est lancé automatiquement au démarrage du PC. Pour cela, il suffit de mettre un raccourcis ici:
    Windows en anglais: C:\Users\utilisateur\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
    Et en français: C:\Users\utilisateur\AppData\Roaming\Microsoft\Windows\Menu Démarrer\Programmes\Démarrage

    Comme je n'utilise pas de fonctions spécifiques à Windows, rien ne s'oppose à ce que ça fonctionne aussi sur Linux (je n'ai pas essayé sur OSX).

    A noter que, comme c'est du PyQt5, les développeurs courageux peuvent aussi faire ça directement en C++ avec Qt5!

    J'utilise ça aussi pour une 2ème application: une console "jupyter" (qtconsole). Elle me permet à tout moment avec un simple clic, d'afficher une console Python pour pouvoir faire des calculs complexes, d'autant qu'on peut ajouter toutes les fonctions personnelles de calcul qu'on veut (calcul de crédit par exemple): c'est rapide et très puissant.

    A voir, bien sûr, si cette classe "QSystemTrayIcon" peut répondre au problème posé...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour tyrtamos !
    Non il ne s'agit pas d'un systrayico mais bien de la petite fenêtre de notification qui s'ouvre et se referme 5 secondes plus tard, voilà ce que ça donne :
    Nom : notif.jpg
Affichages : 630
Taille : 29,7 Ko

    Salut danielhagnoul !

    Merki je vais retourner sur win10Toast alors ! Ce n'est pas parfait mais ça fera l'affaire ! J'aurais préféré pouvoir configurer le clic (gauche, droit, bas, haut...) mais je ferais sans !

  4. #4
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Bien le bonjour !

    Comme "beaucoup" je cherche une solution en python pour appeler une fonction lorsque je clique sur une notification windows ! [...]



    Il y a peut être un espoir de solution en Python dans cette discussion : jithurjacob/Windows-10-Toast-Notifications ; Added on-click callback feature #38 ;

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  5. #5
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Attention c'est implémenté dans un fork : https://github.com/Charnelx/Windows-...st/__init__.py

    J'ai copié/coller le code dans le module w10Notif (Toaster est déjà installé) et j'ai testé le code ci-dessous qui fonctionne très bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    from w10Notif import ToastNotifier
     
    toaster = ToastNotifier()
     
     
    def say_hello():
        print('Bonjour !')
     
     
    toaster.show_toast(
        title="Notification",
        msg="Here comes the message",
        icon_path=None,
        duration=5,
        threaded=False,
        callback_on_click=say_hello)
     
     
    def f(p):
        print(p)
     
     
    n = 8
     
    toaster.show_toast(
        title="Notification",
        msg="Here comes the message",
        icon_path=None,
        duration=5,
        threaded=False,
        callback_on_click=lambda: f('Le nombre est {}'.format(n)))

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/04/2016, 15h46
  2. Calendrier et Toast Notification Windows 8 app Store
    Par kadilldév dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/02/2014, 10h06
  3. icones de la barre de notifications Windows
    Par Nicopilami dans le forum Développement Windows
    Réponses: 5
    Dernier message: 04/06/2013, 15h33
  4. Notification Window se ferme trop tôt !
    Par Rastapopoulos dans le forum Silverlight
    Réponses: 4
    Dernier message: 29/10/2010, 12h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo