jithurjacob / Windows-10-Toast-Notifications

Python library to display Windows 10 Toast Notifications
MIT License
970 stars 168 forks source link

Stay in Notification Center #32

Open mrchaosbude opened 6 years ago

mrchaosbude commented 6 years ago

is possible that the notification will remain in the Notification Center ?

ed-french commented 6 years ago

I think it's precise name is "Windows Action Center" if that helps.

SamuelYvon commented 6 years ago

Also looking for this feature! There is a duration setting in the win API. I will make a pr within this week if there is no response.

ghost commented 6 years ago

I tried to not call the DestroyWindow function to stay in the "Windows Action Center", it seems to be no problems.

JuicyJuuce commented 6 years ago

@jithurjacob Along the lines of what @usradd said, I think the best solution would be to change the code so that if you set duration=0 then the notification never closes.

kurbanis commented 5 years ago

This has been requested in issue #15 with the intention of being implemented but would love to see this supported.

umutinevi commented 5 years ago

duration = None worked for me .

Arsennnic commented 4 years ago

Set "duration = None" is easy, but it will raise an error, and you will fail to call the function "show_toast()" again. In fact, you can just comment line 153 in __init__.py, and the problem can be solved. Function "on_destroy()" will be like:

    def on_destroy(self, hwnd, msg, wparam, lparam):
        """Clean after notification ended.

        :hwnd:
        :msg:
        :wparam:
        :lparam:
        """
        nid = (self.hwnd, 0)
        # Shell_NotifyIcon(NIM_DELETE, nid)
        PostQuitMessage(0)

        return None

Or you can overwrite the function "on_destroy()". For example,

from win10toast import ToastNotifier

class MyToastNotifier(ToastNotifier):

    def on_destroy(self, hwnd, msg, wparam, lparam):
        pass

toaster = MyToastNotifier()
toaster.show_toast("Test", "Hello world!", threaded=True)
eugene-yang commented 4 years ago

@Arsennnic Just try catch the exception will do the job as well :)

from win10toast import ToastNotifier

toaster = ToastNotifier()
try:
    toaster.show_toast("Test", "Hello world!", duration=None)
except TypeError:
    pass

Or simply let the thread die

toaster.show_toast("Test", "Hello world!", duration=None, threaded=True)

One question for people, taking this kind of approach means hijacking the line sleep(duration) and prevent DestroyWindow(self.hwnd) from executing. But UnregisterClass(self.wc.lpszClassName, None) will also not executed as well. Is it going to raise any problem if the notification is not unregistered? Or does unregistering means removing it from that Action Center?