Python实现Windows上气泡提醒效果的方法

时间:2022-09-13 23:58:02

本文实例讲述了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程序设计有所帮助。