1. 程式人生 > >【c#】最小化到托盤DefWndProc接收不到訊息事件

【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;