如果您创建的应用程序是运行在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. Ansible的roles标准化与Jenkins持续集成(三)

    Ansible的roles标准化与Jenkins持续集成(三) 链接:https://pan.baidu.com/s/1A3Iq3gGkGS27L_Gt37_I0g 提取码:ncy2 复制这段内容后打 ...

  2. 前端学习(一)html标签(笔记)

    html->标签 标题标签:<h1>标题文字</h1>段落标签:<p>段落文字</p>换行标签:<br/>图片标签:<img s ...

  3. Ubuntu更换阿里云数据源

    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo vim /etc/apt/sources.list 将里面的内容全部删除修改成 ...

  4. react 数据发生变化,页面改变的原理

    数据发生变化,页面改变的原理: 比较虚拟的dom 不怎么损耗性能,真实的dom比较会损耗性能 1.state 数据 2.jsx 模板 3.生成虚拟的dom 3.数据和模板结合,生成虚拟的dom 4.用 ...

  5. spark window本地运行wordcount错误

    在运行本地运行spark或者hadoop代码时可能会遇到一下三种问题   1.Exception in thread "main" java.lang.UnsatisfiedLin ...

  6. 并查集(Disjoint Set Union,DSU)

    定义: 并查集是一种用来管理元素分组情况的数据结构. 作用: 查询元素a和元素b是否属于同一组 合并元素a和元素b所在的组 优化方法: 1.路径压缩 2.添加高度属性 拓展延伸: 分组并查集 带权并查 ...

  7. CF734E Anton and Tree

    \(\mathtt{CF734E}\) \(\mathcal{Description}\) 给一棵\(n(n\leq200000)\)个节点的树,每个点为黑色或白色,一次操作可以使一个相同颜色的连通块 ...

  8. docker部署coredns

    示例: [root@corends coredns]# cd /home/coredns/ [root@corends coredns]# ls -al total drwxr-xr-x root r ...

  9. Java中Map集合的基本功能

    Map基本方法: put方法: remove方法: isEmpty方法: . clear方法: containsKey方法: containsValue方法 size方法: get方法: keySet ...

  10. JQuery 浮动DIV显示提示信息并自动隐藏

    /** * 浮动DIV定时显示提示信息,如操作成功, 失败等 * @param string tips (提示的内容) * @param int height 显示的信息距离浏览器顶部的高度 * @p ...