最初的解決方像是想變更焦點,因為 Winform 沒有類似 Blur() 的函式,所以在 SelectedIndexChanged 事件加入:
// 下拉選單選擇後就讓焦點消失,避免USER滾到滑鼠滾輪 this.ActiveControl = null;
但是,如果 USER 這樣操作:點了選單,但並沒有改變選項,又再次點擊選單本身,滾輪依然是有效的。想在 MouseLeave 內處理,但是同上,沒有離開 (Leave) 也是無效。
上述的方式換成讓其他元件 Focus() 也可以,問題在於沒有合適的事件能處理。最後只好新建一個 ComboBox 類別,繼承原生物件,但屏蔽滑鼠滾論事件。
using System.Windows.Forms; namespace LIB.MyControl { // 定義一個新的 ComboBox,繼承原本元件,但排除滾論事件 (m.Msg == 0x020A) public class ComboBoxNoWheel : System.Windows.Forms.ComboBox, IMessageFilter { public ComboBoxNoWheel() { Application.AddMessageFilter(this); // 整個 Application 都會有影響 } public bool PreFilterMessage(ref Message m) { if (m.Msg == 0x020A && this.Focused) // 加入 this.Focused,判斷 ComboBox 為焦點時才作用,避免影響整個 Application return true; return false; } } }
參考資料:
https://blog.csdn.net/jamex/article/details/4257679