当某个程序后台运行时,如果某个窗体提示用户有新的消息需要用户浏览等情况下,该窗体就会出现闪烁,从而提示用户浏览该窗体中的信息,同样,当我们在开发一个系统软件时,也可以通过某个窗体不停闪烁,来提示用户浏览某个窗体中的信息,那么,在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();
}
评论