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

最近入了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;




                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值