• 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);
             }
         }
     }
  • 相关阅读:
    windows平台HTTP代理server搭建(CCproxy)
    张冬:OpenPOWER CAPI为什么这么快?(二)
    编程算法
    从U盘安装win8系统
    两个队列模拟一个栈
    jQuery源代码学习笔记:jQuery.fn.init(selector,context,rootjQuery)代码具体解释
    安装Linux系统到u盘
    Windowsclient开发简单介绍(四)
    咏南中间件集群
    delphi调用oracle存储过程(ODAC)
  • 原文地址:https://www.cnblogs.com/jx270/p/2917832.html
Copyright © 2020-2023  润新知