2009-09-21 3 views
1

У меня есть настройка крючка для получения событий мыши в плагине, который я разрабатываю. Мне нужно, чтобы получить WM_LBUTTONDBLCLK, и я ожидаю, что поток сообщений будет:Крючок MouseProc и WM_LBUTTONDBLCLK

WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK

Если я вызываю следующий крюк при работе с первым WM_LBUTTONDOWN, то поток, как и ожидалось. Однако, если я верну свой собственный результат, тогда ожидаемый двойной щелчок появится как сообщение мыши. Любая идея, почему это происходит? Мне нужно, чтобы сообщение остановилось после того, как я его обработаю, и не передал его следующему крючку.

ответ

2

После того, как сделать немного читать более в MSDN, я думаю, что объяснение такого поведения лежит в этом замечании на WM_LBUTTONDBLCLK странице:

только окна, которые имеют стиль CS_DBLCLKS может получить WM_LBUTTONDBLCLK сообщения , который система генерирует всякий раз, когда пользователь нажимает, отпускает и снова нажимает левую кнопку мыши в пределах системы с двойным щелчком по сроку.

Если ваша программа возвращает ненулевое значение, если она обрабатывает WM_LBUTTONDOWN или WM_LBUTTONUP, то эти сообщения не отправляются в целевое окно - как и ожидалось. Однако мой вывод, основанный на приведенной выше цитате, заключается в том, что, поскольку ни одно окно с типом CS_DBLCLKS не принимает сообщения (поскольку крючок предотвращает любое окно от приема сообщений), система поэтому не хочет для генерации WM_LBUTTONDBLCLK.

Иными словами, система генерирует только WM_LBUTTONDBLCLKтогда и только тогда, когда (а) окно получает предыдущие WM_LBUTTONDOWN/WM_LBUTTONUP сообщения и (б), что окно имеет CS_DBLCLKS стиль. Поскольку ваш крючок предотвращает выполнение условия (a), WM_LBUTTONDBLCLK никогда не генерируется и поэтому отправляется сообщение WM_LBUTTONDOWN.

Что касается обходного пути, я сомневаюсь, что есть идеальное решение. Я предполагаю, что причина, по которой вы хотите получить сообщение WM_LBUTTONDBLCLK, - значит, ваш крючок знает, является ли регулярное сообщение WM_LBUTTONDOWN вторым щелчком двойного щелчка, правильно?В этом случае, что вы можете сделать, это прочитать время двойного щелчка из реестра, как предлагает Фейсал, и ваш крючок измеряет время между сообщениями WM_LBUTTONDOWN, однако есть большой шанс, что вы получите неточные результаты (из-за времени задержки между отправляемые сообщения). В качестве альтернативы, если вы каким-то образом можете перенаправить сообщения /WM_LBUTTONUP, возможно, скрытое окно, которое принадлежит вашему крюку (у которого есть стиль CS_DBLCLKS), система может в конечном итоге создать сообщение WM_LBUTTONDBLCLK и отправить его в свое скрытое окно, которое вы может обрабатываться в этом окне WndProc (хотя у меня нет большого опыта с подключением, поэтому я не знаю, возможно ли это).

+0

GRB, спасибо за ввод. Это имеет большой смысл. В итоге я использовал первый обходной путь, который вы упомянули, и он работает хорошо (по крайней мере, на моей машине). Мы посмотрим, насколько хорошо пользователям это нравится. – macfarley5

0

Вы вызываете CallNextHookEx() перед возвратом собственного результата - в соответствии с документацией MSDN MouseProc настоятельно рекомендуется вызывать его с тех пор, как вы вернете свой собственный результат, чтобы предотвратить вызов других крючков.

Считаете ли вы использование low level mouse hook? Это не требует, чтобы ваша DLL была внедрена в процесс, который был подключен, и я считаю, что это более последовательный и мощный крючок (хотя и более ресурсоемкий, если не закодирован соответствующим образом) - особенно при прослушивании кликов в некоторых устаревших приложениях (было тот, который был закодирован в древнем delphi) и клики в приложениях, обслуживаемых терминальными серверами (citrix). Единственная проблема с крючками с низким уровнем мыши заключается в том, что они не получают двойных щелчков по отдельности - это означает, что вам нужно запросить реестр для «DoubleClickSpeed», а затем проверить два события мыши на этом интервале, прежде чем запускать двойной щелчок ,

+0

Я думаю, он * хочет *, чтобы другие крючки не получали сообщения, не вызвав вызов CallNextHookEx() '(достоинства/этики, о которых я не буду касаться). Проблема, хотя (если я читаю это право), заключается в том, что когда он это делает, его программа получает сообщение 'WM_LBUTTONDOWN' вместо' WM_LBUTTONDBLCLK', поведение, на которое у меня нет ответа. – GRB

+0

Точно. Спасибо GRB. – macfarley5

+0

Faisal, мой плагин построен поверх пользовательского интерфейса программного обеспечения, в которое я подключаюсь. Поэтому, когда я нажимаю на что-то в своем пользовательском интерфейсе, я не хочу, чтобы основная программа получала клик, потому что это могло изменить ситуацию, и я теряю исходное состояние программы. – macfarley5