Skip to content

Instantly share code, notes, and snippets.

@wontoncc
Last active March 1, 2024 15:47
Show Gist options
  • Save wontoncc/1808234 to your computer and use it in GitHub Desktop.
Save wontoncc/1808234 to your computer and use it in GitHub Desktop.
Balloon tip module, Python, using win32gui.
# -- coding: utf-8 --
from win32api import *
from win32gui import *
import win32con
import sys, os
import struct
import time
class WindowsBalloonTip:
def __init__(self, title, msg):
message_map = {
win32con.WM_DESTROY: self.OnDestroy,
}
# Register the Window class.
wc = WNDCLASS()
hinst = wc.hInstance = GetModuleHandle(None)
wc.lpszClassName = "PythonTaskbar"
wc.lpfnWndProc = message_map # could also specify a wndproc.
classAtom = RegisterClass(wc)
# Create the Window.
style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
self.hwnd = CreateWindow( classAtom, "Taskbar", style, \
0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \
0, 0, hinst, None)
UpdateWindow(self.hwnd)
iconPathName = os.path.abspath(os.path.join( sys.path[0], "balloontip.ico" ))
icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE
try:
hicon = LoadImage(hinst, iconPathName, \
win32con.IMAGE_ICON, 0, 0, icon_flags)
except:
hicon = LoadIcon(0, win32con.IDI_APPLICATION)
flags = NIF_ICON | NIF_MESSAGE | NIF_TIP
nid = (self.hwnd, 0, flags, win32con.WM_USER+20, hicon, "tooltip")
Shell_NotifyIcon(NIM_ADD, nid)
Shell_NotifyIcon(NIM_MODIFY, \
(self.hwnd, 0, NIF_INFO, win32con.WM_USER+20,\
hicon, "Balloon tooltip",title,200,msg))
# self.show_balloon(title, msg)
time.sleep(10)
DestroyWindow(self.hwnd)
def OnDestroy(self, hwnd, msg, wparam, lparam):
nid = (self.hwnd, 0)
Shell_NotifyIcon(NIM_DELETE, nid)
PostQuitMessage(0) # Terminate the app.
def balloon_tip(title, msg):
w=WindowsBalloonTip(msg, title)
@chriskiehl
Copy link

Awesome! Just the thing I was looking for!

@clippit
Copy link

clippit commented Aug 27, 2012

Thanks! But why * missed on L3-4 and __init__ shows incorrectly?

@boppreh
Copy link

boppreh commented Nov 2, 2012

Title and msg seem swapped, too, and there's a typo in the main function name ( ballon ). I've forked this Gist with the corrections: https://gist.github.com/4000505

@brousch
Copy link

brousch commented Sep 11, 2013

I PEPped up @boppreh's version a bit and fixed the "no 2nd notification" issue that @endolith reported. It still has one issue, which is that only one notification at a time can display, so if a 2nd notification is attempted before the 1st has finished, the 2nd is ignored. https://gist.github.com/brousch/6523559

@endolith
Copy link

@davidcorbin
Copy link

Ayy great in Windows 10!

@Thomas-Rudge
Copy link

Hi, this looks really great. But in windows 10 the notification does not persist in the action center. And if I try to call balloon_tip more than once I get an error:

Traceback (most recent call last):
  File "<string>", line 301, in runcode
  File "<interactive input>", line 1, in <module>
  File "C:\Users\Lenovo\Documents\Python\temp.py", line 54, in balloon_tip
    w=WindowsBalloonTip(msg, title)
  File "C:\Users\Lenovo\Documents\Python\temp.py", line 26, in __init__
    classAtom = RegisterClass(wc)
pywintypes.error: (1410, 'RegisterClass', 'Class already exists.')

@DarkRedman
Copy link

It doesn't work, I get an error.

from win32api import *
ImportError: DLL load failed: %1 is not a Win32 valid application.

@aswinpj
Copy link

aswinpj commented Mar 29, 2016

How do I change the Icon on the balloon tip? It doesnt work even after adding a .ico file by the name balloontip.ico on the root directory.

@Aanand-Kainth
Copy link

Can somebody please fork a copy in which notifications are persistent? I know this would include registering the program outside of the class, and unregistering it with with atexit, but I am unable to do so myself.

@deeman30rus
Copy link

thanks man, that worked for me!

@abhijeetsc
Copy link

when I am running the same code I am not getting any type of notification only.
I am using Python 3.5 on Windows 10.

@jithurjacob
Copy link

Hi guys, I've created this as an easy to use package

https://github.com/jithurjacob/Windows-10-Toast-Notifications

@guyverone
Copy link

here to say thank you.

@danielfain
Copy link

Works great on Windows 10. Thanks man!

@purplesyringa
Copy link

In case you have "win32api" module missing, try pip install pypiwin32.

@frakman1
Copy link

To use this feature, you would write code like this:

import balloontip as bt

bt.balloon_tip("My Title", "My Message")

and get something that looks like this (on Windows 7):

image

@vineethpisvas1
Copy link

Can anyone please tell me how to add a click bind to this notification. I want to open a website or do some task on the click and I am not able to bind it in the message map. Please help!

@vineethpisvas1
Copy link

@hao-lee
Copy link

hao-lee commented Oct 29, 2019

@jithurjacob

Hi guys, I've created this as an easy to use package

https://github.com/jithurjacob/Windows-10-Toast-Notifications

This is awesome! Thanks.

@ukowa
Copy link

ukowa commented May 21, 2020

Hi guys, I've created this as an easy to use package

https://github.com/jithurjacob/Windows-10-Toast-Notifications

that is indeed awesome - thank you!

@soyuznik
Copy link

soyuznik commented May 5, 2021

working on windows 10

@sdfiokpskiopdf
Copy link

working on windows 11

@fredericomattos
Copy link

working on Python 3.10 with windows 11

@Tunglies
Copy link

working on Python 3.10 with Windows 11 Pro for Workstations Version 10.0.22621 Build 22621

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment