如何过滤编辑框滚动条触发的额外WM_TIMER事件?
解决方案:过滤EditBox滚动条的内置WM_TIMER消息
你的问题核心是混淆了自定义计时器和EditBox滚动条的内置计时器消息:EditBox的滚动条会创建自己的悬停关联计时器(用于滚动提示、自动滚动等逻辑),这些计时器触发的WM_TIMER消息会被你的主窗口消息循环捕获,而你当前的代码没有区分自定义计时器和系统内置计时器的ID,导致误触发。
具体解决步骤
在处理WM_TIMER消息时,通过判断计时器ID(即msg.wParam),只响应你自己创建的ID为1的计时器:
修改你的代码片段:
SetTimer(Window_Main, 1, 1000, 0 ) Do 'Main loop to check WinAPI event states: WaitEvent(Window_Main, msg) Select Case msg.message Case WM_TIMER ' 只处理自定义的ID为1的计时器消息 If msg.wParam = 1 And LogState = Run_ Then Get_Data End If End Select ' 其他控件的消息处理... Select Case msg.hwnd Case Btn_TstCom If msg.message = WM_LBUTTONUP Then EditBox_Paste(LogWindow) End If Case Btn_ClrLog ' 你的Btn_ClrLog处理逻辑 End Select Loop
原理说明
SetTimer创建的计时器会通过WM_TIMER的wParam参数携带计时器ID,你自定义的计时器ID是1;- EditBox滚动条的内置计时器使用的是系统分配的其他ID,因此通过
msg.wParam = 1的判断可以精准过滤掉这些多余的系统计时器消息,只执行你需要的每秒数据记录逻辑。
内容的提问来源于stack exchange,提问作者tonigau
相关产品推荐
相关产品推荐

