原文:FlashWindowEx实现窗口在任务栏闪烁/变化颜色

效果类似QQ收到新的会话消息任务栏颜色变化

附2小段代码:

[System.Runtime.InteropServices.DllImport("user32.dll")]     
  static   extern   int   FlashWindow   (int   hwnd,   int   bInvert);   
  private   void   button1_Click(object   sender,   System.EventArgs   e)   
  {   
    FlashWindow(this.Handle.ToInt32(),1); // 参数为1时启动闪烁, 参数为0时停止闪烁 
  }
 
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool FlashWindow(
              IntPtr hWnd,           //   handle   to   window  
              bool bInvert       //   flash   status  
              );   
private void button1_Click(object sender, EventArgs e)
{
  FlashWindow(this.Handle, true);
}

当后台应用程序完成工作,可以通过闪动窗体来通知用户.

1.利用窗体的Activate方法

this.Activate();

此方法会直接将目标窗体显示在当前工作窗体的前面.并且当目标窗体被最小化时,使用此方法基本无效.

2.利用Windows API-FlashWindowEx

查了MSDN发现与Flash Window相关的API有两个:

一个FlashWindow,函数原型为:

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

此API只闪动窗体一次,显然不是我们想要的结果.

另外一个是FlashWindowEx,函数原型为:

BOOL WINAPI FlashWindowEx( __in PFLASHWINFO pfwi);

参数PFLASHWINFO 声明为:

typedef struct {
UINT cbSize;
HWND hwnd;
DWORD dwFlags;
UINT uCount;
DWORD dwTimeout;
} FLASHWINFO, *PFLASHWINFO;
字段说明:

cbSize结构体FLASHWINFO的大小.

hwnd要闪动的窗体的句柄.窗体可以是打开的也可以是最小化的.

dwFlags

闪动的状态/标志. 此参数可以是以下的值或值的组合(用或操作符"|"组合).

含义

FLASHW_ALL
0x00000003

闪动窗体标题和任务栏按钮,等于将此参数设置为:

FLASHW_CAPTION | FLASHW_TRAY.

FLASHW_CAPTION
0x00000001
闪动窗体的标题.

FLASHW_STOP
0
停止闪动.系统将窗体恢复到初始状态.

FLASHW_TIMER
0x00000004
连续不停的闪动,直到此参数被设置为:FLASHW_STOP

FLASHW_TIMERNOFG
0x0000000C
连续不停的闪动,直到窗体用户被激活.通常用法将参数设置为: FLASHW_ALL | FLASHW_TIMERNOFG

FLASHW_TRAY
0x00000002
闪动任务栏按钮

uCount闪动的次数.

dwTimeout闪动频率,单位毫秒. 如果dwTimeout值为0, 函数使用光标的闪动频率.

在C#中引用此API:

1.因为FlashWindowEx的参数是一个FLASHWINFO结构体类型,所以首先按FLASHWINFO格式声明一个结构体:

public struct FLASHWINFO
{
public UInt32 cbSize;
public IntPtr hwnd;
public UInt32 dwFlags;
public UInt32 uCount;
public UInt32 dwTimeout;
}

2. 导入API原型:

[DllImport("user32.dll")]
static extern bool FlashWindowEx(ref FLASHWINFO pwfi);

3.应用API:

private void button1_Click(object sender, EventArgs e)
{

//此处按API中参数dwFlags的取值范围声明常量,方便在使用API时调用,实际应用时可以考虑放到一个专门的文件中

public const UInt32 FLASHW_STOP = 0;
public const UInt32 FLASHW_CAPTION = 1;
public const UInt32 FLASHW_TRAY = 2;
public const UInt32 FLASHW_ALL = 3;
public const UInt32 FLASHW_TIMER = 4;
public const UInt32 FLASHW_TIMERNOFG = 12;

this.WindowState = FormWindowState.Minimized;

//准备参数

FLASHWINFO fInfo = new FLASHWINFO();

fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
fInfo.hwnd = this.Handle;
fInfo.dwFlags = FLASHW_ALL | FLASHW_TIMERNOFG;//这里是闪动窗标题和任务栏按钮,直到用户激活窗体
fInfo.uCount = UInt32.MaxValue;
fInfo.dwTimeout = 0;

//调用API

FlashWindowEx(ref fInfo);
}

至此,闪动窗体通知用户的功能实现.

完整代码为:

using System;

 using System.Collections.Generic;

 using System.ComponentModel;

 using System.Data;

 using System.Drawing;

 using System.Linq;

 using System.Text;

 using System.Windows.Forms;

 using System.Runtime.InteropServices;

 

 namespace FlashWindowEX

 {

     public struct FLASHWINFO

     {

         public UInt32 cbSize;

         public IntPtr hwnd;

         public UInt32 dwFlags;

         public UInt32 uCount;

         public UInt32 dwTimeout;

     } 

 

     public partial class Form1 : Form 

     {

         public const UInt32 FLASHW_STOP = 0;

         public const UInt32 FLASHW_CAPTION = 1;

         public const UInt32 FLASHW_TRAY = 2;

         public const UInt32 FLASHW_ALL = 3;

         public const UInt32 FLASHW_TIMER = 4;

         public const UInt32 FLASHW_TIMERNOFG = 12; 

 

         public Form1() 

         { 

             InitializeComponent(); 

         } 

 

         [DllImport("user32.dll")] 

         static extern bool FlashWindowEx(ref FLASHWINFO pwfi);

 

         [DllImport("user32.dll")]

         static extern bool FlashWindow(IntPtr handle, bool invert); 

 

 

         private void button1_Click(object sender, EventArgs e) 

         {

             this.WindowState = FormWindowState.Minimized; 

 

             FLASHWINFO fInfo = new FLASHWINFO();

 

             fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));

             fInfo.hwnd = this.Handle;

             fInfo.dwFlags = FLASHW_TRAY | FLASHW_TIMERNOFG;//这里是闪动窗标题和任务栏按钮,直到用户激活窗体

             fInfo.uCount = UInt32.MaxValue;

             fInfo.dwTimeout = 0; 

 

             FlashWindowEx(ref fInfo);

         }

     }

 }

FlashWindowEx实现窗口在任务栏闪烁/变化颜色的更多相关文章

  1. 如何在Word表格中的某一栏添加背景颜色

     如何在Word表格中的某一栏添加背景颜色 编写人:CC阿爸 2014-3-14 用鼠标选中某一个单元格然后右键单击 下拉菜单选择.<边框和低纹>然后点<低纹>选项卡 选中色卡 ...

  2. Android 修改底部导航栏navigationbar的颜色

    Android 修改底部导航栏navigationbar的颜色 getWindow().setNavigationBarColor(Color.BLUE); //写法一 getWindow().set ...

  3. 2019-9-2-win10-uwp-随着数字变化颜色控件

    title author date CreateTime categories win10 uwp 随着数字变化颜色控件 lindexi 2019-09-02 12:57:38 +0800 2018- ...

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

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

  5. wpf 任务栏闪烁

    [StructLayout(LayoutKind.Sequential)] public struct FLASHWINFO { public UInt32 cbSize; public IntPtr ...

  6. VC 窗口出现白屏闪烁的解决办法

    处理一下窗口的WM_ERASEBKGND消息即可. 在messagemap里添加ON_WM_ERASEBKGND() 在窗口头文件里添加 afx_msg BOOL OnEraseBkgnd(CDC* ...

  7. QT无标题窗口在任务栏显示关闭(增加系统菜单)

    在对话框中使用了如下代码: setWindowFlags(Qt::FramelessWindowHint); 在任务栏上右键点击程序,不会弹出菜单,解决办法,使用下面代码: setWindowFlag ...

  8. MFC的程序,不想显示窗口,任务栏里也不显示

    在dialog的oninitdialog里设置如下属性,很简单,网上一些乱七八糟的做法,一行代码就能搞定啊 SetWindowPos(&CWnd::wndNoTopMost,0,0,0,0,S ...

  9. duilib窗口从任务栏恢复问题

    关闭.最大最小化和恢复等消息由WM_SYSCOMMAND和OnSysCommand()进行处理,需要在HandleMessage()中添加处理.

随机推荐

  1. 数组中的逆序对(Java实现)

    来源:剑指offer 逆序对定义:a[i]>a[j],其中i<j 思路:利用归并排序的思想,先求前面一半数组的逆序数,再求后面一半数组的逆序数,然后求前面一半数组比后面一半数组中大的数的个 ...

  2. 盐城 - 开设IT公司的好地方

    盐城:位于江苏省北部,这一好像只能算三线的城市,不久前当选为“国家中心城市”.在全国仅有的50城市中名列34.它可成为发展IT产业的好地方. (1)人才济济.从这里走出去的高级人才数不胜数,留在这里的 ...

  3. tkinter做一个简单的登陆页面(十六)

    做一个简单的登陆页面 import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry("900x3 ...

  4. linux上文件内容去重的问题uniq/awk

    1.uniq:只会对相邻的行进行判断是否重复,不能全文本进行搜索是否重复,所以往往跟sort结合使用. 例子1: [root@aaa01 ~]# cat a.txt 12 34 56 12 [root ...

  5. Linux运维平台工具:pstree、ps、top、htop、free、vmstat、dstat、kill、killall

    1.pstree命令 查看进程树,centos7下统一由systemd进行管理 [root@ELK-chaofeng systemd]# pstree systemd─┬─AliYunDun───*[ ...

  6. java返回值是list的时候获取list的参数类型

    Type[] resultArgType = null; Type resultType = method.getGenericReturnType(); if (resultType instanc ...

  7. Java面试题以及答案精选(架构师面试题)-基础题1

    基础题 一.String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?1. String是字符串常量,StringBuffer和StringBu ...

  8. python五十七课——正则表达式(元字符)

    1).匹配单个字符(数字.英文.其它) 符号位: []:表示一个字符位 [0123456789]:表示一位,取值范围:[0,9]之间的任何一个值 [0-9]:表示一位,取值范围:[0,9]之间的任何一 ...

  9. Xpath语法-爬虫(一)

    前言 这一章节主要讲解Xpath的基础语法,学习如何通过Xpath获取网页中我们想要的内容;为我们的后面学习Java网络爬虫基础准备工作. 备注:此章节为基础核心章节,未来会在网络爬虫的数据解析环节经 ...

  10. codechef Row and Column Operations 题解

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...