C# TreeView控件双击事件转换为两次单击事件的实现求助
解决TreeView双击转两次独立单击问题
直接替换你现有自定义TreeView类的代码即可实现需求,无需修改其他业务逻辑:
class MyTreeView : TreeView { // 定义Windows消息常量 private const int WM_LBUTTONDOWN = 0x0201; private const int WM_LBUTTONDBLCLK = 0x0203; protected override void WndProc(ref System.Windows.Forms.Message m) { // 拦截鼠标左键双击消息 if (m.Msg == WM_LBUTTONDBLCLK) { // 手动触发一次左键按下消息,补全第二次单击的按下流程 Message secondClickDown = Message.Create(m.HWnd, WM_LBUTTONDOWN, m.WParam, m.LParam); base.WndProc(ref secondClickDown); // 跳过默认双击处理逻辑 return; } // 其余消息走默认处理 base.WndProc(ref m); } }
逻辑说明
系统触发双击时的默认消息序列为:
- 第一次左键按下(WM_LBUTTONDOWN)
- 第一次左键抬起(WM_LBUTTONUP)
- 双击事件(WM_LBUTTONDBLCLK)
- 第二次左键抬起(WM_LBUTTONUP)
你原有代码直接拦截双击消息后返回,只保留了第一次单击的完整流程,因此仅能触发单次单击。上述修改在拦截到双击消息时手动发送一次左键按下消息,和后续系统自动发送的第二次左键抬起消息匹配,即可形成完整的第二次单击流程,最终实现将一次双击转换为两次独立单击的效果。
内容的提问来源于stack exchange,提问作者Jens Slofstra
相关产品推荐
相关产品推荐

