正在运行的程序,出现故障,或者接收到通信信息。客户端如何提示?
方案一:语音提示【播报一段语音】或者【‘滴滴’声】。
方案二:图标提示【托盘图标闪烁】【任务栏图标醒目】
综合考虑下,一二结合更合理。
首先语音提示
c# 中
using System.Runtime.InteropServices;
SpVoiceClass voice = new SpVoiceClass();
voice.Speak("Hello word",SpeechVoiceSpeakFlags.SVSFlagsAsync);
朗读对应信息。
业务上可放于监听位置(需要监听的设备-观察者模式可用),或接收通信信息位置 触发即可。
其次图标提示
托盘图标。
winform -- 拉入NotifyIcon
注意是主界面,拉入小弹窗就是闹着玩的。
0.窗口最小化事件
private void MainFrameView_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)//最小化到系统托盘
{
//notifyIcon.Visible = true;//显示托盘图标
//this.Hide();//隐藏窗口
}
}
注意,为了实现任务栏图标提示(非托盘)此事件不用,因为会隐藏掉任务栏图标
1.窗口关闭事件
private void MainFrame_FormClosing(object sender, FormClosingEventArgs e)
{
//注意判断关闭事件Reason来源于窗体按钮,否则用菜单退出时无法退出!
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;//取消"关闭窗口"事件
this.WindowState = FormWindowState.Minimized;//使关闭时窗口向右下角缩小的效果
notifyIcon.Visible = true;
this.Hide();
return;
}
}
2.双击任务栏图标
private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
notifyIcon.Visible = false;
this.Show();
WindowState = FormWindowState.Normal;
this.Focus();
}
3.图标闪烁
加个定时器,间隔自己定,给个状态判断就行
private void timer1_Tick(object sender, EventArgs e)
{
if (this.notifyIcon1.Visible)
this.notifyIcon1.Visible = false;
else
this.notifyIcon1.Visible = true;
}
同样可以拓展下,比如换图标什么的。
气泡窗提示
气泡窗提示,触发在接受信息时
private void showTip(string text)
{
notifyIcon.ShowBalloonTip(1000, "您有新的消息xxxx", text, ToolTipIcon.Info);
}
任务栏图标
关于这个图标,是直接调用user32.dll的
[DllImport("User32.dll", CharSet = CharSet.Unicode, EntryPoint = "FlashWindowEx")]
private static extern void FlashWindowEx(ref FLASHWINFO pwfi);
public struct FLASHWINFO
{
public UInt32 cbSize;//该结构的字节大小
public IntPtr hwnd;//要闪烁的窗口的句柄,该窗口可以是打开的或最小化的
public UInt32 dwFlags;//闪烁的状态
public UInt32 uCount;//闪烁窗口的次数
public UInt32 dwTimeout;//窗口闪烁的频度,毫秒为单位;若该值为0,则为默认图标的闪烁频度
}
public const UInt32 FLASHW_TRAY = 2;
public const UInt32 FLASHW_TIMERNOFG = 12;
private void FlashWin()
{
FLASHWINFO fInfo = new FLASHWINFO();
fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
fInfo.hwnd = this.Handle;
fInfo.dwFlags = FLASHW_TRAY | FLASHW_TIMERNOFG;
fInfo.uCount = 3;// UInt32.MaxValue;
fInfo.dwTimeout = 500;
FlashWindowEx(ref fInfo);
}
拿过来直接用,调用FlashWin()即可。
散花