如果您创建的应用程序是运行在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实时消息的一个问题。
干得好,西蒙 - 非常好的技巧!

delphi 任务栏按钮闪烁(转)的更多相关文章

  1. DELPHI中如何闪烁应用程序窗口或任务栏按钮

    使用FlashWindowEx函数: 一.设置FlashWInfoDelphi中TFlashWInfo申明如下:TypeTFlashWInfo = record cbSize : LongInt; h ...

  2. Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁可是不能切换

    Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁可是不能切换 1. 可能你的Alt+Tab键被别人禁用了,试下以下的方法: 1 2. 为什么要禁用Alt+Tab 1 3. ALT+TAB ...

  3. iOS开发 横向分页样式 可左右滑动或点击头部栏按钮进行页面切换

    iOS开发 横向分页样式 可左右滑动或点击头部栏按钮进行页面切换 不多说直接上效果图和代码 1.设置RootViewController为一个导航试图控制器 //  Copyright © 2016年 ...

  4. WPF 任务栏背景闪烁提醒

    原文:WPF 任务栏图标闪烁提醒   public static class FlashWindow { [DllImport("user32.dll")] [return: Ma ...

  5. VC 任务栏图标闪烁

    像QQ来消息时的,图标闪烁效果 将如下代码添加到Timer响应函数中 ) {// 任务栏图标闪烁 if (this != GetForegroundWindow()) { //// this-> ...

  6. Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁但是不能切换

    Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁但是不能切换 1. 可能你的Alt+Tab键被别人禁用了,试下下面的方法: 1 2. 为什么要禁用Alt+Tab 1 3. ALT+TAB ...

  7. C# 程序启动最小化至任务栏及闪烁

    主要功能: C#让窗体最小化至任务栏,同时在系统托盘区的图标点击左键能显示窗体,并使窗体闪烁. 首先: 创建窗体应用程序,并添加控件NotifyIcon及ContextMenuStrip控件 Noti ...

  8. Delphi窗体最大化按钮不可用情况下的最大化

    最大化按钮不可用,而且窗体最大化,我以前一直这样设置:在Object Inspector下把BorderIcons属性下的biMaximize属性设置为False,然后把WindowState属性设置 ...

  9. VB6之调整任务栏按钮的位置

    好无聊,睡前一更~ XP的任务栏没办法像win7那样随意拖动交换顺序,偶觉不爽,遂写程序搞之.这个不算什么新东西,参考了很多别人写的东东. 程序启动后,会在右下角托盘区显示钢铁侠的图标.右键击之,可选 ...

随机推荐

  1. linux上安装php phpredis扩展

    linux 下安装redis以及php Redis扩展 环境配置: centos6.0 nginx/1.0.0 php/5.3.8 mysql/5.5.17 步骤一.下载redis 可以去http:/ ...

  2. es的日期格式

    https://www.elastic.co/guide/en/elasticsearch/reference/2.3/mapping-date-format.html 在es中,默认的时间类型为da ...

  3. 【leetcode】970. Powerful Integers

    题目如下: Given two non-negative integers x and y, an integer is powerful if it is equal to x^i + y^j fo ...

  4. python基础特性之函数property

    函数property 1.为了保护属性,不让它随意的被更改(a.width=xxx)(起码,要符合某些条件),所以我们引入了set和get方法,虽然这个需要自定义(如下图的set_size,get_s ...

  5. 【Dart学习】-- Dart之泛型

    一,概述  Dart是一种可选的类型语言.Dart中的集合默认是异构的.换句话说,单个Dart集合可以托管各种类型的值.但是,可以使Dart集合保持同质值.泛型的概念可以用来实现同样的目的. 泛型的使 ...

  6. docker组件如何协作(7)

    还记得我们运行的第一个容器吗?现在通过它来体会一下 Docker 各个组件是如何协作的. 容器启动过程如下: Docker 客户端执行 docker run 命令. Docker daemon 发现本 ...

  7. Guava EventBus集成spring

    EventBus 不是通用的消息系统,也不是用来做进程间的通信的,而是在进程内,用于解耦两段直接调用的业务逻辑: 1.代码结构 event:eventbus中流转的事件(消息),包结构按照业务模块在细 ...

  8. requests_html爬虫小练习

    爬取豆瓣TOP250 from requests_html import HTMLSession #新建一个html文件,将相应的代码放入,运行查看结果,如果页面全部渲染则直接根据页面信息获得数据: ...

  9. jmter 5.1 中文

    一.jmeter5.0下载解压后,默认的界面是英文版的,许多人觉得不方便,想要汉化,jmeter是不需要安装汉化包的,通过修改配置文件即可:1.找到jmeter解压后的文件夹,例如我是安装在D:\De ...

  10. Centos7.4安装elasticsearch6.3+kibana6.3集群

    Centos7.4安装elasticsearch+kibana集群 Centos7.4安装elasticsearch+kibana集群 主机环境 软件环境 主机规划 主机安装前准备 安装jdk1.8 ...