После того, как сделать немного читать более в 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
(хотя у меня нет большого опыта с подключением, поэтому я не знаю, возможно ли это).
GRB, спасибо за ввод. Это имеет большой смысл. В итоге я использовал первый обходной путь, который вы упомянули, и он работает хорошо (по крайней мере, на моей машине). Мы посмотрим, насколько хорошо пользователям это нравится. – macfarley5