最近入了c# 开始做些基本的东西 其中在做最小化到托盘时碰到个卡了很久的问题 在这里记录一下
需要不论窗体有没有最小化 收到消息后都在 托盘用气泡显示出来
测试发现当窗体存在时 可以成功显示出托盘图标并显示消息5秒后消失
但当最小化到托盘后 却没有显示 检查发现DefWndProc再没有接收到任何消息了
经过多番查阅资料和尝试终于发现问题的所在
问题就出在
this.ShowInTaskbar = false;
和
FormWindowState.Minimized
上
Hide()方法隐藏窗体也会隐藏任务栏 即使不设置ShowInTaskbar或设置ShowInTaskbar为true 任务栏都会隐藏
若再次设置该属性就会造成收不到消息事件的问题 具体原因不明【期待大牛解答】
此外 FormWindowState.Minimized 该属性本身除了最小化窗体外 还具有屏蔽传入的消息事件的性质 所以不能设置为该属性(微软官方的说明中好像都没提到这一点....)
FormWindowState源码
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case SDKLib.EVENT_MESSAGE:
{
strValue = "接收到消息 " + FromASCIIByteArray(EventData.szData);
if (this.notifyIcon.Visible == true) {
this.notifyIcon.ShowBalloonTip(5000, EventData.uCID.ToString(),strValue , ToolTipIcon.Info);// 显示气泡提示
}else {
this.notifyIcon.Visible = true;
this.notifyIcon.ShowBalloonTip(5000,EventData.uCID.ToString(),strValue , ToolTipIcon.Info);// 显示气泡提示
Thread.Sleep(5000); this.notifyIcon.Visible = false; }
} break; default: base.DefWndProc(ref m); break; } }
需要不论窗体有没有最小化 收到消息后都在 托盘用气泡显示出来
最小化到托盘的方法
private void MinizedBtnClick(object sender, EventArgs e)
{
this.Hide();//隐藏窗体
this.ShowInTaskbar = false;//不显示到任务栏
this.notifyIcon.Visible = true;//显示托盘图标
this.WindowState = FormWindowState.Minimized;//窗口状态为最小化
this.notifyIcon.ShowBalloonTip(3000, "", "后台运行", ToolTipIcon.Info);// 显示气泡
}
测试发现当窗体存在时 可以成功显示出托盘图标并显示消息5秒后消失
但当最小化到托盘后 却没有显示 检查发现DefWndProc再没有接收到任何消息了
经过多番查阅资料和尝试终于发现问题的所在
问题就出在
this.ShowInTaskbar = false;
和
FormWindowState.Minimized
上
Hide()方法隐藏窗体也会隐藏任务栏 即使不设置ShowInTaskbar或设置ShowInTaskbar为true 任务栏都会隐藏
若再次设置该属性就会造成收不到消息事件的问题 具体原因不明【期待大牛解答】
此外 FormWindowState.Minimized 该属性本身除了最小化窗体外 还具有屏蔽传入的消息事件的性质 所以不能设置为该属性(微软官方的说明中好像都没提到这一点....)
FormWindowState源码
namespace System.Windows.Forms
{
//
// 摘要:
// 指定窗体窗口如何显示。
[ComVisible(true)]
public enum FormWindowState
{
//
// 摘要:
// 默认大小的窗口。
Normal = 0,
//
// 摘要:
// 最小化的窗口。
Minimized = 1,
//
// 摘要:
// 最大化的窗口。
Maximized = 2
}
}
所以这两句话去掉就好了
//this.ShowInTaskbar = false;
//this.WindowState = FormWindowState.Minimized;