2

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

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

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

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

1 ответ1

1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .