【c#】最小化到托盘DefWndProc接收不到消息事件
2016-11-29 17:54
483 查看
最近入了c# 开始做些基本的东西 其中在做最小化到托盘时碰到个卡了很久的问题 在这里记录一下
需要不论窗体有没有最小化 收到消息后都在 托盘用气泡显示出来
最小化到托盘的方法
测试发现当窗体存在时 可以成功显示出托盘图标并显示消息5秒后消失
但当最小化到托盘后 却没有显示 检查发现DefWndProc再没有接收到任何消息了
经过多番查阅资料和尝试终于发现问题的所在
问题就出在
this.ShowInTaskbar = false;
和
FormWindowState.Minimized
上
Hide()方法隐藏窗体也会隐藏任务栏 即使不设置ShowInTaskbar或设置ShowInTaskbar为true 任务栏都会隐藏
若再次设置该属性就会造成收不到消息事件的问题 具体原因不明【期待大牛解答】
此外 FormWindowState.Minimized 该属性本身除了最小化窗体外 还具有屏蔽传入的消息事件的性质 所以不能设置为该属性(微软官方的说明中好像都没提到这一点....)
FormWindowState源码
所以这两句话去掉就好了
//this.ShowInTaskbar = false;
//this.WindowState = FormWindowState.Minimized;
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;
相关文章推荐
- C# 微信企业号--接收普通消息与事件
- C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
- C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法,可通过重写WndProc来实现
- C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
- C#实现系统托盘,C#窗体最小化时隐藏为任务栏图标
- VB.NET WndProc、C# WndProc 与系统消息的链接地址
- C#编写最小化到系统托盘的Windows应用程序
- C#实现窗口最小化到系统托盘
- C#窗体的最大化/最小化/还原/最小化到托盘/NotifyIcon的代码实现
- C#实现窗口最小化到系统托盘
- C# Windows Form 最小化系统托盘(Tray)
- C#实现托盘代码仿qq最小化图标
- c# 程序最小化到系统托盘
- C# WinForm窗口最小化到系统托盘
- c# 中如何定义和接收消息
- c# 中如何定义和接收消息
- c# 中如何定义和接收消息?(转)
- 怎么获得主窗口的CWnd*?怎么把CWnd*变成HWND?怎么给HWND发送WM_USER消息?SendMessage(hwnd,WM_USER,0,0);可是主窗口接收不到
- c#捕获窗体的最大化最小化按钮的事件
- C# 中如何定义和接收消息