C# DateTimePicker控件如何检测上下调节按钮的点击事件?
DateTimePicker 上下调节按钮专属触发逻辑实现思路
下面提供3种可落地的实现方案,按优先度排序:
方案1:重写控件消息捕获专属通知(最精准,无误判)
用户点击上下调节按钮、按上下方向键调整数值时,控件会发送专属的DTN_DELTAPOS通知消息,该消息仅由用户交互触发,代码修改Value属性不会触发,非常适配你的需求。
以WinForm C#为例,重写DateTimePicker的WndProc方法即可捕获:
protected override void WndProc(ref Message m) { const int WM_NOTIFY = 0x004E; const int DTN_FIRST = -740; const int DTN_DELTAPOS = DTN_FIRST - 3; if (m.Msg == WM_NOTIFY) { NMHDR nmhdr = (NMHDR)m.GetLParam(typeof(NMHDR)); if (nmhdr.code == DTN_DELTAPOS) { // 这里直接停止你的定时器即可 StopMyTimer(); } } base.WndProc(ref m); }
注:NMHDR为系统通知消息结构体,可直接使用.NET内置定义或自行声明。
方案2:代码修改标记法(改造成本最低)
不需要修改控件,仅需新增一个全局标记区分操作来源即可:
- 所有代码自动修改
DateTimePicker.Value的逻辑(包括你的定时器递增逻辑),修改前先将isProgrammaticModify标记设为true,修改完成后置为false - 在
OnValueChanged事件中仅当isProgrammaticModify == false时,才执行停止定时器的逻辑
方案3:输入事件联合判断(适配不想改控件也不想加全局标记的场景)
同时监听控件的鼠标、键盘事件做前置判断:
- 监听
MouseDown事件:判断点击坐标是否落在控件右侧上下按钮的区域范围内 - 监听
KeyDown事件:判断是否按下了上/下方向键且控件处于激活状态 - 只要满足上述任一条件后触发的
OnValueChanged事件,判定为用户操作,执行停止定时器逻辑
该方案的缺点是需要额外处理长按按钮、焦点切换等边界场景,稳定性低于前两种。
内容的提问来源于stack exchange,提问作者葛润禅
相关产品推荐
相关产品推荐

