本文实例讲述了Python实现Windows上气泡提醒效果的方法。分享给大家供大家参考。具体实现方法如下:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
# -*- encoding: gbk -*-
import sys
import os
import struct
import time
import win32con
from win32api import *
# Try and use XP features, so we get alpha-blending etc.
try :
from winxpgui import *
except ImportError:
from win32gui import *
class PyNOTIFYICONDATA:
_struct_format = (
"I" # DWORD cbSize; 结构大小(字节)
"I" # HWND hWnd; 处理消息的窗口的句柄
"I" # UINT uID; 唯一的标识符
"I" # UINT uFlags;
"I" # UINT uCallbackMessage; 处理消息的窗口接收的消息
"I" # HICON hIcon; 托盘图标句柄
"128s" # TCHAR szTip[128]; 提示文本
"I" # DWORD dwState; 托盘图标状态
"I" # DWORD dwStateMask; 状态掩码
"256s" # TCHAR szInfo[256]; 气泡提示文本
"I" # union {
# UINT uTimeout; 气球提示消失时间(毫秒)
# UINT uVersion; 版本(0 for V4, 3 for V5)
# } DUMMYUNIONNAME;
"64s" # TCHAR szInfoTitle[64]; 气球提示标题
"I" # DWORD dwInfoFlags; 气球提示图标
)
_struct = struct.Struct(_struct_format)
hWnd = 0
uID = 0
uFlags = 0
uCallbackMessage = 0
hIcon = 0
szTip = ''
dwState = 0
dwStateMask = 0
szInfo = ''
uTimeoutOrVersion = 0
szInfoTitle = ''
dwInfoFlags = 0
def pack( self ):
return self ._struct.pack(
self ._struct.size,
self .hWnd,
self .uID,
self .uFlags,
self .uCallbackMessage,
self .hIcon,
self .szTip,
self .dwState,
self .dwStateMask,
self .szInfo,
self .uTimeoutOrVersion,
self .szInfoTitle,
self .dwInfoFlags
)
def __setattr__( self , name, value):
# avoid wrong field names
if not hasattr ( self , name):
raise NameError, name
self .__dict__[name] = value
class MainWindow:
def __init__( self , title, msg, duration = 3 ):
# Register the Window class.
wc = WNDCLASS()
hinst = wc.hInstance = GetModuleHandle( None )
wc.lpszClassName = "PythonTaskbarDemo"
# 字符串只要有值即可,下面3处也一样
wc.lpfnWndProc = { win32con.WM_DESTROY: self .OnDestroy }
# could also specify a wndproc.
classAtom = RegisterClass(wc)
# Create the Window.
style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
self .hwnd = CreateWindow(classAtom, "Taskbar Demo" , style,
0 , 0 , win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
0 , 0 , hinst, None
)
UpdateWindow( self .hwnd)
iconPathName = os.path.abspath(os.path.join(sys.prefix, "pyc.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, "Balloon tooltip demo" )
Shell_NotifyIcon(NIM_ADD, nid)
self .show_balloon(title, msg)
time.sleep(duration)
DestroyWindow( self .hwnd)
def show_balloon( self , title, msg):
# For this message I can't use the win32gui structure because
# it doesn't declare the new, required fields
nid = PyNOTIFYICONDATA()
nid.hWnd = self .hwnd
nid.uFlags = NIF_INFO
# type of balloon and text are random
nid.dwInfoFlags = NIIF_INFO
nid.szInfo = msg[: 64 ]
nid.szInfoTitle = title[: 256 ]
# Call the Windows function, not the wrapped one
from ctypes import windll
Shell_NotifyIcon = windll.shell32.Shell_NotifyIconA
Shell_NotifyIcon(NIM_MODIFY, nid.pack())
def OnDestroy( self , hwnd, msg, wparam, lparam):
nid = ( self .hwnd, 0 )
Shell_NotifyIcon(NIM_DELETE, nid)
PostQuitMessage( 0 ) # Terminate the app.
if __name__ = = '__main__' :
MainWindow( "您有一条短消息" , "您该睡觉了" )
|
希望本文所述对大家的Python程序设计有所帮助。