我想在拖动鼠标时捕获重复的 500ms Form_Timer 事件。即在鼠标按下和鼠标弹起事件之间。Timer 事件在拖动之外触发,但在拖动之内不触发。
之所以使用 Timer 事件,是因为程序在拖动过程中会进行大量处理,并且通常无法捕捉到最近的鼠标位置 - 捕捉到 Timer 事件后,程序可以轮询当前鼠标位置。[例如,用户可能快速将鼠标拖到 MouseMove 未报告的位置,然后在那里保持拖动状态]
还有其他人遇到过或者解决过这个问题吗?
我在 Windows XP Pro SP3 和 Windows 7 Starter 上都经历过这种情况。
答案1
这是因为 GUI 中的所有事件都在单个“事件调度线程”上运行,而拖动的鼠标处理事件会导致计时器排队。这些事件实际上是窗口消息,并且必须从单个线程调用消息处理程序。鼠标拖动使事件线程保持“忙碌”,因此在拖动发生时它无法运行任何其他窗口过程。这是原始本机 Windows GUI 的设计限制之一,Access 2003 就是使用它的程序之一。
输入处理和线程模型在较新版本的 Windows 和不同的框架(例如 Office 2010 中使用的框架)中得到了改进。不确定它是否能解决您的问题,但尝试新版本的 Office 可能会有所帮助。
您可以尝试的另一件事是运行一个调用的忙循环执行事件时不时地处理窗口消息,并且只使用睡眠来计时 500 毫秒中断,而不是让系统每 500 毫秒调用一次事件。