您的位置:首页 > 编程语言 > C#

【c#】最小化到托盘DefWndProc接收不到消息事件

2016-11-29 17:54 483 查看
最近入了c# 开始做些基本的东西 其中在做最小化到托盘时碰到个卡了很久的问题 在这里记录一下

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# 托盘 DefWndProc