如果您创建的应用程序是运行在
Windows 98
或更高版本操作系统上,您可以通过调用
API
函数
FlashWindowEx
并赋给它一个
FlashWInfo
结构体来实现
.
而如果是运行在
Windows 95
上则比较麻烦,
但您也可以通过使用一个
Timer
组件来实现想要的效果。
FlashWindowEx
当您调用
API
函数
FlashWindowEx
时,一个
TFlashWInfo
被用来控制
Windows
实现该闪烁功能的信息
.
幸运的是,
Delphi
已经为您封装了该结构体。
Delphi
中它被申明如下:
type TFlashWInfo = record cbSize : LongInt; hWnd : LongInt; dwFlags : LongInt; uCount : LongInt; dwTimeout : LongInt; end;
您所需做的全部事情仅仅是填充和组装该记录类型,并调用
API
函数。本例中,我把两者放在了一个按钮的
OnClick
事件中,当然您也可以放置它们到任何合适的地方:
procedure TForm1.Button1Click(Sender: TObject);
var FWinfo: TFlashWInfo;
begin
FWinfo.cbSize := 20;
FWinfo.hwnd := Application.Handle; // 闪烁窗口的句柄
FWinfo.dwflags := FLASHW_ALL;
FWinfo.ucount := 10; // 闪烁的次数
FWinfo.dwtimeout := 0; // 速度以毫秒为单位, 0 默认为与指针闪烁的速率相同
FlashWindowEx(FWinfo); // 使它闪烁!
end;
dwflags
指示了闪烁的方式,下面是
dwflags
属性的取值定义:
FLASHW_STOP = 0 // 停止闪烁FLASHW_CAPTION = 1 // 闪烁窗口标题FLASHW_TRAY = 2 // 闪烁任务栏按钮FLASHW_ALL = 3 // 闪烁窗口标题与任务栏按钮
FLASHW_TIMER = 4 // 不停地闪烁,直到FLASHW_STOP标志设置FLASHW_TIMERNOFG = 5 // 不停地闪烁直到窗口被前置
以上只有在
Windows 98
或更高版本操作系统上才有效,如果您要在
Windows 95
上实现,您就需要采取另一不同的途径:
FlashWindow
Windows 95
下
(
并且
Delphi 3
及更底版本并包含适用的
API
封装
)
需要不同的途径
.
该操作系统下没有
FlashWindowEx
这个
API
函数,您需要使用
FlashWindow
来代替
. (FlashWindow
还能在更低版本的操作系统中被调用。)
但问题是
FlashWindow
只能闪烁一次,所以要达到闪烁按钮的目的就需要用到一个
timer
组件。
当然,这样一来也就加大了宝贵的系统资源开销
-
但它能完成我们想要的效果。
为了达到本示例的目的,您需要创建一个
form
,并放上一个
Timer
组件和一个按钮组件。
之后选中
Timer
组件并双击,
OnTimer
事件将被创建
.
接着添加以下代码:
procedure TForm1.Timer1Timer(Sender: TObject);begin FlashWindow(Application.Handle, True);end;
下一步,你需要启动闪烁。这一步很简单,在
Button
的
OnClick
事件中设置
Timer
的
Enabled
属性为
Ture
。本例中我使用
Button
的事件来切换闪烁的开与关:
procedure TForm1.Button1Click(Sender: TObject);begin Timer1.Enabled := not Timer1.Enabled;end;
到此为止,两种不同方法实现了相同的功能。
?Chris Bray /Vertical Software 2002
示例贴出还没几分钟,西蒙
·
克莱顿(
Simon Clayton
)就提出了一个闪烁方法的建议
——
仅当应用程序不是当前活动的一个时。
西蒙改写如下:
我是这样做的:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (GetForeGroundWindow()<>Form1.Handle) then
begin
FWinfo.cbSize := 20;
FWinfo.hwnd := Application.Handle;
FWinfo.dwflags := FLASHW_ALL;
FWinfo.ucount := 5;
FWinfo.dwtimeout := 0;
Flashing := True;
FlashWindowEx(FWinfo);
end
else
if (Flashing) then
begin
FWinfo.cbSize := 20;
FWinfo.hwnd := Application.Handle;
FWinfo.dwflags := FLASHW_STOP;
FWinfo.ucount := 0;
FWinfo.dwtimeout := 0;
FlashWindowEx(FWinfo);
Flashing := false;
end;
end;
我也在
Form
的
onPaint
事件中加入了一些停止闪烁的代码:
procedure TForm1.FormPaint(Sender: TObject);begin if (Flashing) then begin FWinfo.cbSize := 20; FWinfo.hwnd := Application.Handle; FWinfo.dwflags := FLASHW_STOP; FWinfo.ucount := 0; FWinfo.dwtimeout := 0; FlashWindowEx(FWinfo); end;end;
我现在要解决的唯一一个问题是,如果我正我第二台显示器使用一个应用程序,而窗体却在我第一个显示器的顶层,那么当我切换回应用程序时,
onPaint
事件好像没能被调用
。也就是说闪烁一直在进行
-
我注意到这应该是
MS
实时消息的一个问题。
干得好,西蒙
-
非常好的技巧
!