【c#】最小化到托盤DefWndProc接收不到訊息事件
阿新 • • 發佈:2019-01-07
最近入了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;