用Python实现Windows上的气泡提醒

标签:Python

原文来自:http://www.3snews.net/html/50/550-20986.html
我稍微改了下而已,经试验在XP下有效。
# -*- 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("您有一条短消息", "您该睡觉了")

7条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?