`
bcyy
  • 浏览: 1827735 次
文章分类
社区版块
存档分类
最新评论

wxPython实现窗口在任务栏中闪烁

 
阅读更多

版权所有,转载请注明出处:http://guangboo.org/2013/05/14/wxpython-flashwindow-using-win32api

为提醒用户注意,通常采用窗口闪烁的效果来达到这一目的,就像即时聊天工具QQ, Jabber等,当收到好友发来的消息时通常会闪烁托盘中的图标,如果聊天窗口是打开的,那么就会闪烁打开的聊天窗口在任务栏中的按钮,甚至有时连窗口的标题栏都会闪烁。

其实实现这样的闪烁功能是很简单的,如果对windows api熟悉的话,就会对FlashWindow函数不会陌生,该函数可以实现简单的窗口闪烁功能,只是窗口只闪烁一下,函数声明如下:

BOOL WINAPI FlashWindow(
  _In_  HWND hWnd,
  _In_  BOOL bInvert
);

参数说明可以参考windows api文档:http://msdn.microsoft.com/en-us/library/windows/desktop/ms679346(v=vs.85).aspx

如果要定义窗口闪烁的次数和频率可以使用另一个函数FlashWindowEx,声明如下:

BOOL WINAPI FlashWindowEx(
  _In_  PFLASHWINFO pfwi
);

该函数接收一个结构体参数PFLASHWINFO,结构体的声明如下:

typedef struct {
  UINT  cbSize;
  HWND  hwnd;
  DWORD dwFlags;
  UINT  uCount;
  DWORD dwTimeout;
} FLASHWINFO, *PFLASHWINFO;

主要的参数是dwFlags,该参数有多个组合,分别为:

  • FLASHW_ALL(0x00000003):同时闪烁窗口标题栏和任务栏按钮,等于FLASHW_CAPTION |FLASHW_TRAY
  • FLASHW_CAPTION(0x00000001):闪烁窗口标题栏;
  • FLASHW_STOP(0):停止闪烁,系统重置窗口到初始状态
  • FLASHW_TIMER(0x00000004):不停的闪烁,知道FLASHW_TOP标记被设置
  • FLASHW_TIMERNOFG(0x0000000C):不停闪烁,直到窗口前端显示
  • FLASHW_TRAY(0x00000002):闪烁窗口在任务栏的按钮;

参数uCount表示闪烁的次数,当然如果dwFlags的值有FLASHW_TIMER或FLASHW_STOP时,该参数就无效了。dwTimeout是闪烁频率(毫秒)。

这里使用Python+wxPython编写如何使用函数FlashWindowEx来实现窗口的闪烁效果。代码如下:

# -*- coding:utf-8 -*-
'''
    filename : winapi.py
'''
from ctypes import *
import win32con

__all__ = ['flash']

FlashWindowEx = windll.user32.FlashWindowEx

class FLASHWINFO(Structure):
    _fields_ = [('cbSize', c_uint),
                ('hwnd', c_uint),
                ('dwFlags', c_uint),
                ('uCount', c_uint),
                ('dwTimeout', c_uint)]
    
def flash(hwnd):
    '''Flash a window with caption and tray.'''
    info = FLASHWINFO(0, hwnd, win32con.FLASHW_ALL | win32con.FLASHW_TIMERNOFG, 0, 0)
    info.cbSize = sizeof(info)
    FlashWindowEx(byref(info))

使用方法,在wx.Frame窗口中调用该函数:

import winapi
winapi.flash(self.GetHandle())

函数flash就是实现了闪烁窗口标题栏和任务栏按钮,直到窗口被激活,闪烁才停止。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics