当某个程序后台运行时,如果某个窗体提示用户有新的消息需要用户浏览等情况下,该窗体就会出现闪烁,从而提示用户浏览该窗体中的信息,同样,当我们在开发一个系统软件时,也可以通过某个窗体不停闪烁,来提示用户浏览某个窗体中的信息,那么,在c#编程语言中该如何编写代码实现某个窗体标题栏不停闪烁的效果呢?
关键代码:
public partial class BlinkingForm : Form { // 引入Windows API [StructLayout(LayoutKind.Sequential)] public struct FLASHWINFO { public uint cbSize; public IntPtr hwnd; public uint dwFlags; public uint uCount; public uint dwTimeout; } [DllImport("user32.dll")] [return: MarshalAs(MarshalType.Bool)] public static extern bool FlashWindowEx(ref FLASHWINFO pwfi); // 闪烁标志 public const uint FLASHW_ALL = 3; // 闪烁窗口标题栏和任务栏按钮 public const uint FLASHW_TIMERNOFG = 12; // 持续闪烁,直到窗口获得焦点 private Timer flashTimer; private bool isFlashing = false; public BlinkingForm() { InitializeComponent(); flashTimer = new Timer { Interval = 5000 }; // 5秒后停止闪烁 flashTimer.Tick += (sender, e) => StopFlashing(); } // 开始闪烁 public void StartFlashing() { if (isFlashing || this.Focused) return; FLASHWINFO fInfo = new FLASHWINFO { hwnd = this.Handle, dwFlags = FLASHW_ALL | FLASHW_TIMERNOFG, uCount = uint.MaxValue, dwTimeout = 0 }; fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo)); FlashWindowEx(ref fInfo); isFlashing = true; flashTimer.Start(); } // 停止闪烁 public void StopFlashing() { FLASHWINFO fInfo = new FLASHWINFO { hwnd = this.Handle, dwFlags = 0, uCount = uint.MaxValue, dwTimeout = 0 }; fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo)); FlashWindowEx(ref fInfo); isFlashing = false; flashTimer.Stop(); } // 窗体获得焦点时停止闪烁 protected override void OnActivated(EventArgs e) { base.OnActivated(e); StopFlashing(); } }
使用示例:
// 在需要闪烁的地方调用 private void SomeEventTriggeringFlash(object sender, EventArgs e) { if (!this.Focused) StartFlashing(); }
评论