Access 2003 VBA Form_Timer не срабатывает при перетаскивании мышью

2

Я хочу поймать повторяющееся событие 500 мс Form_Timer при перетаскивании мыши. то есть между событиями мыши вниз и мыши вверх. Событие Timer запускается вне перетаскивания, но не внутри.

Причиной события Timer является то, что программа выполняет значительную обработку во время перетаскивания и часто не улавливает самое последнее местоположение мыши - после перехвата события таймера программа может опрашивать текущее положение мыши. [Например, пользователь мог быстро перетащить мышь в положение, о котором MouseMove не сообщает, а затем удерживать перетаскивание там]

Кто-нибудь еще имел или решил эту проблему?

Я испытал это на Windows XP Pro SP3 и Windows 7 Starter.

user167471
источник

Ответы:

1

Это связано с тем, что все события в графическом интерфейсе выполняются в одном «потоке диспетчеризации событий», а при обработке события перетаскивания мышью таймер ставится в очередь. События на самом деле являются оконными сообщениями, и обработчики сообщений должны вызываться из одного потока. При перетаскивании мышью поток событий «занят», поэтому он не может запускать другие оконные процедуры во время перетаскивания. Это одно из конструктивных ограничений исходных собственных графических интерфейсов Windows, из которых Access 2003 является одной из таких программ, которые его используют.

Обработка ввода и модель многопоточности были улучшены в более новых версиях Windows и с другими платформами, например, используемыми в Office 2010. Не уверен, что это решит вашу проблему, но это может помочь попробовать новую версию Office.

Еще одна вещь, которую вы можете попробовать - это запустить занятый цикл, который периодически вызывает DoEvents для обработки оконных сообщений, и просто использовать спящие таймеры для прерывания 500 мс, вместо того, чтобы система вызывала ваше событие каждые 500 мс.

allquixotic
источник
1
DoEvents будет работать, но есть компромисс: циклы без него будут выполняться быстрее на порядок. Если все, что вы делаете, это предоставляет информацию о пользователе (например, индикатор выполнения), то DoEvents на каждой 10-й итерации (и т. Д. И т. П.) Может быть лучшим выбором.
Горацио