版权所有,转载请注明出处: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就是实现了闪烁窗口标题栏和任务栏按钮,直到窗口被激活,闪烁才停止。