WPF上实现任务栏闪烁

2025-02-27T00:00:00Z | 1分钟阅读 | 更新于 2025-02-27T00:00:00Z

@

最近做了客户端的IM联系窗口的功能,有一个需求是如果收到新的消息时,任务栏需要闪烁提醒用户。 效果类似于微信和飞书收到新消息。

Windows有提供任务栏闪烁的API,直接调API即可。我这里把相关的功能都封装了一下,作为一个工具类,分享出来。 知识点:

  1. 从C#侧调用win32的 api
  2. 把win32 api需要的参数用struct的的形式声明出来,并且标注StructLayout.Sequntial
public static class WpfHelper
{
    // 停止闪烁
    public const uint FLASHW_STOP = 0;
    // 闪烁窗口标题
    public const uint FLASHW_CAPTION = 1;
    // 闪烁任务栏按钮
    public const uint FLASHW_TRAY = 2;
    // 同时闪烁窗口标题和任务栏按钮
    public const uint FLASHW_ALL = 3;
    //持续闪烁,直到手动停止
    public const uint FLASHW_TIMER = 4;
    // 闪烁直到窗口获得焦点
    public const uint FLASHW_TIMERNOFG = 12;

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool FlashWindowEx(ref FLASHWINFO pwfi);

    [StructLayout(LayoutKind.Sequential)]
    private struct FLASHWINFO
    {
        public uint cbSize;
        public IntPtr hwnd;
        public uint dwFlags;
        public uint uCount;
        public uint dwTimeout;
    }

    /// <summary>
    /// 任务栏和指定窗口闪烁,直到该窗口获得焦点
    /// </summary>
    /// <param name="window"></param>
    public static bool FlashTaskbarAndWindow(Window window)
    {
        FLASHWINFO fwi = new FLASHWINFO();
        fwi.cbSize = Convert.ToUInt32(Marshal.SizeOf(fwi));
        fwi.dwFlags = FLASHW_ALL | FLASHW_TIMER;
        fwi.uCount = uint.MaxValue;
        fwi.dwTimeout = 0;

        if (window == null)
        {
            window = Application.Current.MainWindow;
        }
        var wih = new WindowInteropHelper(window);
        fwi.hwnd = wih.Handle;

        return FlashWindowEx(ref fwi);
    }

    /// <summary>
    /// 暂停任务栏和指定窗口的闪烁
    /// </summary>
    /// <param name="window"></param>
    public static bool StopFlashing(Window window)
    {
        FLASHWINFO fwi = new FLASHWINFO();
        fwi.cbSize = Convert.ToUInt32(Marshal.SizeOf(fwi));
        fwi.dwFlags = FLASHW_STOP;
        fwi.uCount = uint.MaxValue;
        fwi.dwTimeout = 0;
        if (window == null)
        {
            window = Application.Current.MainWindow;
        }
        var wih = new WindowInteropHelper(window);
        fwi.hwnd = wih.Handle;
        return FlashWindowEx(ref fwi);
    }
}

I have not failed. I’ve just found 10,000 ways that won’t work.

© 2025 huanjian's blog

🌱 Powered by Hugo with theme Dream.

Me

你好,我是火箭。火箭是我在在公司和互联网上使用的花名。 我的主要工作是开发 Windows 客户端软件,技术栈以 WPF + C# 为主。业余时间会折腾一些小项目,通常是 React + FastAPI 的组合,先现生活在杭州,活动范围主要是江浙沪这块。独立博客看得多了,也逐渐被激发了表达欲,注册域名,做了我的独立博客。

爱好
  • 三国演义:从大二开始听评书版的《三国演义》,现在主要是作为睡前小故事来听(我估计是第七八遍了)
  • 写代码:没错,写代码也是我的爱好。只要出门超过半天,我基本都会背着笔记本,随时可能进入“编码模式”。
  • 健身:曾经的爱好。结婚之后就逐渐被抛弃了 🤷,结婚一年涨了10斤。
  • 看电影:后续可能会写影评。
  • 探索新事物和工具:准备开一个主题,专门分享我接触到的各种新玩意儿。
记录什么?
  • 学习笔记

  • 一些想法:记录日常思考,不一定有结论,更像是一种随手的表达。

  • 旅游与随笔:旅行时的见闻与感受,以及偶尔的文字随笔。